Неточность вычисления с плавающей запятой ANSI C
Как люди справляются с неточностями с плавающей запятой в ANSI C? В этом случае ожидается ожидаемый результат 4,305, но ANSI C возвращает дополнительно 0,000001?
#include<stdio.h>
main()
{
float _lcl1=66.3;
float _ucl1=76;
float lbl1 = 0;
float ubl1 = 0;
lbl1 = (_lcl1 - 2.5 * (_ucl1 - _lcl1));
printf ("%e\n",lbl1);
}
4.205001e+01
У меня есть идеи, что это должно быть общей проблемой, поэтому есть стандартная библиотека для решения этой проблемы, или люди конвертируют их в целые числа, выполняют вычисления, а затем конвертируют их обратно? Может ли кто-нибудь дать представление об успешной стратегии "на практике"?
1 ответ
Это не имеет ничего общего с ANSI C и не имеет ничего общего с арифметикой с плавающей запятой.
Вы должны прочитать: "Что должен знать каждый компьютерщик об арифметике с плавающей точкой" http://www.math.umd.edu/~jkolesar/mait613/floating_point_math.pdf
Чтобы дать неадекватное резюме, арифметика с плавающей запятой не является магическим механизмом с бесконечной точностью - это приблизительный способ представления бесконечного набора действительных чисел с использованием небольшого (обычно 32 или 64) числа битов. Он выполняет свою работу в двоичном, а не в десятичном виде, и дроби, точно представимые в двоичной системе, не совпадают с дробями, которые точно представлены в десятичной дроби. Округление является проблемой, как и интервал между числами.
В любом случае, вы действительно должны прочитать вышеупомянутый документ, если вы работающий программист. Это гораздо больше, чем можно описать в нескольких параграфах о переполнении стека, и тема очень важна.