2012-02-27 79 views
0

ANSI C中人们如何处理浮点不准确?在这种情况下,预期结果为4.305,但ANSI C返回0.000001?ANSI C浮点计算不准确

#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 

想法,我有是,这必须是一个常见的问题,所以有一个标准库来处理这个人或这些转换为整数,做计算,然后将其转换回?有人能提供一些关于成功的“实践”策略的见解吗?

+4

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Mysticial 2012-02-27 17:19:49

+0

我想知道我们会在这里看到多少次浮点问题 – Coren 2012-02-27 18:00:23

+0

人们通过使用十进制算术来处理这个比二进制浮点。这不是内置于C,所以你需要一个库。简而言之,二进制浮点并不是为了满足你的期望而设计的。 – 2012-02-27 22:16:35

回答

7

这与ANSI C无关并且与浮点运算有关。

你应该阅读: “什么每台计算机科学家应该知道关于浮点运算” http://www.math.umd.edu/~jkolesar/mait613/floating_point_math.pdf

举一个不足总结,浮点运算是不是魔术无限精度机制 - 这是一种近似使用小(通常为32或64)位数来表示无限实数集的方式。它以二进制形式工作,而不是十进制形式,而二进制文件中精确表示的分数与十进制中精确表示的分数不同。舍入是一个问题,花车之间的间隔也是一个问题。

无论如何,如果您是一名正常工作的程序员,您应该阅读上述文章。对于这个问题,远远超过Stack Overflow的几段描述,而且这个主题非常重要。

+0

正如您在第3段中提到的,解决方案是使用十进制表示而不是二进制表示 – 2012-02-27 22:17:13

+0

不一定。使用打印输出例程强制重现二进制表示的最小十进制表示可以在许多情况下工作,其他解决方案也可以。这里有好几篇很好的论文,并且是Knuth第2卷中的一个很好的部分。在任何情况下,我都不确定海报是在寻找一种方式来产生符合铅笔和纸十进制计算的结果,他们对这种行为表示困惑(并且他们还没有说出它是什么)。 – Perry 2012-02-27 22:20:35

+0

新链接:http://www.validlab.com/goldberg/paper.pdf – 2015-12-23 08:07:47