如何控制双精度计算以避免C++ linux x86_64中的舍入错误?

use*_*288 1 c++ algorithm precision double rounding-error

在linux x86_64上的C++代码中,我需要加倍精度计算(+或 - ).

26.100000000000001 - 26 + 0.10000000000000001

我有:

0.20000000000000143

我想得到0.2.

这里,显示格式不是导入的,计算结果将用于一些if-else分支条件.所以,我只希望if-else条件比较十进制数字后面的4位数.

这似乎是一个舍入错误?

如何将计算精度限制在小数点后的4位数?

我不想调用任何函数以避免开销.

由于转换开销,我不想使用stringstream.

有更好的想法吗?

谢谢

Mik*_*one 8

计算精度很好.这是你试图控制的显示精度.你可以使用setprecision()if <iostream>或者像格式化器一样"%.4f"使用<stdio.h>.

您已经在调用函数,因为您将结果显示为十进制!

PS 0.1不能精确由a表示float,double任何二进制尾数格式,或.它是因子(1/2) * (1/5),十进制1/5是二进制的无限重复数字序列.

PPS Go看看GMP.这可能是你最大的希望.

  • @ user1002288您可以为所有浮动精度比较添加一些魔术`epsilon`值.就像`if(a == b){}`转换成`if(abs(ab)<1e-4){}`一样.这是使用浮点算术最好的方法. (4认同)