Другие языки программирования и технологии

Borland C++ неправильно считывает float

float x;
scanf("%f",&x);

ввожу 0.05, а при дебаге там не 0,05, а 0,050000000007. Почему так?
Talantbek Tyrysbekov
Talantbek Tyrysbekov
129
Потому что данные в форматах с плавающей запятой представляются в экспоненциальной форме: число представляется как мантисса (набор разрядов фиксированной длины) и порядок (положение запятой, которая разделяет мантиссу на целую и дробную часть) . Поскольку все числа (в том числе и числа с ПЗ) хранятся в памяти компьютера в двоичном коде, при переводе некоторых дробных чисел в двоичный код, а так же при записи их в формат с ПЗ, может произойти ошибка округления или потеря точности.

Из вышесказанного следует, что форматы с ПЗ (в основном IEE754, он же Float) НИКОГДА не хранят математически точное значение числа. Это не зависит от языка программирования, на котором Вы пишете. Но формат Float гарантирует точность до 8-9 десятичных знаков числа после запятой, а формат Double (в два раза длиннее) 16-18 десятичных знаков после запятой.

Поэтому, есть несколько рекомендаций для использования этого формата в Ваших программах:
1. Выбирайте формат адекватной точности. Если вам нужно 4-5 знаков после запятой, вам вполне хватит точности Float.
2. Не беспокойтесь о "хвосте" числа, в котором скапливается погрешность. При адекватном выборе формата она не будет для вас критична. Если же вам нужно вывести результат с заданной точностью, используйте либо округление, либо форматированный вывод (а эти функции уже зависят от языка, на котором вы пишете, например в Pascal число A с 4 знаками до запятой и 2 знаками после запятой можно вывести так: Write(A : 4 : 2)).
3. Никогда не сравнивайте два числа в формате с плавающей запятой непосредственно оператором A == B. Вместо этого используйте следующую конструкцию:
float Epsilon = 0.0000001;
float A, B;
...
if (Abs(A - B) < Epsilon) { Вывод: числа равны с точностью Epsilon }

Удачи!
Чернышев Антон
Чернышев Антон
7 465
Лучший ответ