Неточность вычисления с плавающей запятой 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) числа битов. Он выполняет свою работу в двоичном, а не в десятичном виде, и дроби, точно представимые в двоичной системе, не совпадают с дробями, которые точно представлены в десятичной дроби. Округление является проблемой, как и интервал между числами.

В любом случае, вы действительно должны прочитать вышеупомянутый документ, если вы работающий программист. Это гораздо больше, чем можно описать в нескольких параграфах о переполнении стека, и тема очень важна.

Другие вопросы по тегам