颜林林的个人网站

Linlin Yan's Personal Website

浮点数精度问题

2009-06-30 19:03

前段时间我就跟Jim讨论过这个,而今天在网上又看到有人在问,看来这浮点数精度问题,果然是可怜的二进制计算机界的永恒话题啊!

也许我们平时都不是特别注意,想当然地会认为精度问题离我们很遥远,其实不然:

#include <iostream>

int main()
{
    std::cout << ".1 + .2 == .3" << std::endl;
    std::cout << (.1 + .2 == .3 ? "true" : "false") << std::endl;

    std::cout << "1e20 + 1000 == 1e20" << std::endl;
    std::cout << (1e20 + 1000 == 1e20 ? "true" : "false") << std::endl;

    return 0;
}

这段程序的输出结果是:

.1 + .2 == .3
false
1e20 + 1000 == 1e20
true

很简单的加法,却是意外的结果吧?

其实原因很简单:计算机在浮点数时,小数部分也是用二进制的(0.5、0.25、0.125、……),所以十进制的很多浮点数都是没法精确表示的。虽然相比我们平常用的 double类型(64位),在CPU的内部会使用更高精度的寄存器(80位)来计算,一定程度上能够缓解精度表示问题,但是这并不能真正解决问题,尤其在比较浮点数相等时会比较明显。

所以,一旦使用了浮点数,一定要再三小心!