Почему добавление двух чисел с плавающей точкой является неправильным в C? - PullRequest
2 голосов
/ 07 сентября 2011

У меня проблема с добавлением двух чисел с плавающей точкой.Код ниже:

float a = 30000.0f;
float b = 4499722832.0f;

printf("%f\n", a+b);

Почему выходной результат равен 450002816.000000?(Правильный должен быть 450002832.)

Ответы [ 3 ]

7 голосов
/ 07 сентября 2011

Число с плавающей точкой не представлено точно в C - см. http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers и http://en.wikipedia.org/wiki/Single_precision,, поэтому вычисления с плавающей точкой могут дать только приблизительный результат.

Это особенно очевидно для больших значений, поскольку возможная разница может быть представлена ​​в процентах от значения. В случае сложения / вычитания двух значений вы получаете худшую точность обоих (и результата).

3 голосов
/ 07 сентября 2011

Значения с плавающей точкой не могут представлять все целочисленные значения.

Помните, что числа с плавающей точкой одинарной точности имеют только 24 (или 23, в зависимости от того, как вы считаете) биты точности (то есть значащие цифры). Таким образом, по мере того, как значения становятся больше, вы начинаете терять низкую точность, поэтому результат ваших вычислений не совсем «правильный».

2 голосов
/ 07 сентября 2011

Из википедии

Одиночная точность, называемая «float» в семействе языков C и «real» или «real * 4» в Fortran.Это двоичный формат, который занимает 32 бита (4 байта) и имеет значение 24 бита ( около 7 десятичных цифр ).

Так что ваш номер нена самом деле вписывается в float.Вместо этого вы можете использовать double.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...