人们如何处理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
我的想法是,这必须是一个常见的问题,所以有一个标准的lib来处理这个或人们将这些转换为整数,进行计算,然后将它们转换回来?有人可以提供一些有关成功&#34;在实践中的见解&#34;策略?
答案 0 :(得分:7)
这与ANSI C无关,而与浮点运算有关。
你应该阅读: “每个计算机科学家应该知道的浮点运算” http://www.math.umd.edu/~jkolesar/mait613/floating_point_math.pdf
为了给出不充分的总结,浮点运算不是神奇的无限精度机制 - 它是使用较小(通常为32或64)位数来表示无限实数集的近似方式。它以二进制形式工作,而不是十进制,并且二进制中精确表示的分数与十进制中可精确表示的分数不同。舍入是一个问题,浮点数之间的间隔也是如此。
无论如何,如果你是一名工作程序员,你真的应该阅读上面的论文。除了可以在Stack Overflow的几个段落中描述之外,还有更多内容,这个主题非常重要。