Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zabolekar
Сообщений: n/a
#1

Как именно округляются float и double? - C++

02.07.2010, 13:51. Просмотров 593. Ответов 1
Метки нет (Все метки)

Вот имеется double l, функция sqrt из cmath и следующие формулы:

C++
1
sqrt(2-2*sqrt(1-l*l/4))
C++
1
sqrt(l*l/4+1-sqrt(1-l*l/4)-sqrt(1-l*l/4)+1-l*l/4)
C++
1
sqrt(l*l/4+(1-sqrt(1-l*l/4))*(1-sqrt(1-l*l/4)))
Если l длина стороны вписанного в круг с радиусом 1 правильного многоугольника с 2^n сторонами, то формула должна вычислить длину стороны вписанного в тот же круг правильного многоугольника с 2^{n+1} cторонами.

Математически эти три формулы одно и то же. Для больших l результаты совпадают, но начиная с e-007 разброд и шатания уже в районе двадцати процентов. Где-то после e-008 первая формула валится в 0. Вторая начиная с e-009 выдаёт nan. Третья выдаёт нечто на первый взгляд осмысленное, но если через эти многоугольники попытаться вычислить пи, то начиная с 268.435.456-угольника получается некое число, которое от пи отличается с четырнадцатого знака после запятой, однако само уже больше не меняется вообще, сколько углов ни делай. Ну, пока в nan не упрётся, конечно.

Я понимаю, что, пока используются double, от ошибок округления никуда не деться. Но мне интересно, почему они именно такие и как их можно более-менее оценить при взгляде на формулу. Особенно я не понимаю, откуда вторая берёт nan. Получает число меньше нуля, а потом из него корень?

Компилятор g++, если это важно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2010, 13:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как именно округляются float и double? (C++):

Преобразовать 2 числа int в 1 число float(double) | double int1.int2 - C++
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их необходимо преобразовать в одно значение типа...

как победить Double? Float? - C++
C++ - так описать нельзя( ну и как мне ее сделать глобальной и есть ли ограничение на кол-во переменных типа ?????? у меня их...

Почему точность Double такая же как у Float ? - C++
Вначале столкнулся с проблемой float: time=65536.0f; (можно и больше число указать) time+=0.003; Тут time не меняетя! Оно меняется,...

Как мне программу с int переделать в Float i double? - C++
как мне програму с int переделать в Float i double??? #include <iostream> using namespace std; int main() { cout...

Значение double, float как можно разложить на байты - C++
Я хочу по протоколу TCP ввиде потока байт передать число с плавающей точкой(не целое). Как это можно сделать? Как разложить на байты число...

Как преобразовать все int,float,double в строки LPWSTR, LPCTSTR - C++
Столкнулся с проблемой не как не переведу в нормальный вид вот код #include <iostream> #include <Windows.h> #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17809 / 6019 / 388
Регистрация: 30.03.2009
Сообщений: 16,535
Записей в блоге: 26
02.07.2010, 15:18 #2
Ответить чтобы было просто и одновременно понятно - сложно. Если не забуду, то вечером дома погляжу. Где-то была ссылка с доступным объянением. Я и сам всё порывался статью написать, но никак не доходили руки и никак не мог определиться, с какого конца начинать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2010, 15:18
Привет! Вот еще темы с ответами:

Как проверить вводилось ли число (типа double или float) в консоль - C++
Как проверить вводилось ли число (типа double или float) в консоль?

Как сделать в конструкциий switch, чтобы он считал норм float и double - C++
Подскажите как сделать в конструкциий switch что бы он считал норм float и doable и возможна как то сделать case 095:

Float/double IEEE754 - C++
Доброго вечера! Как я понимаю на вычисления с плавающей точкой влияет процессор, и компилятор языка. Как узнать поддерживает ли...

Преобразование в float и double - C++
Начал читать книгу Шилдта. В одном из его примеров было показано преобразование типов int в float. Но при компилировании выражения я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru