以更固定的方式添加double到double?

时间:2014-07-08 06:31:45

标签: c++

我在我的代码中使用double而不是float,但不幸的是我遇到了下一个问题: 当我尝试添加:

1.000000000000020206059048177849 + 0.000000000000020206059048177849

我有这个结果:

1.000000000000040400000000000000 

避免使用最后14个数字..我希望结果更准确。 我知道这可能看起来很傻但是这对我来说真的很重要......任何人都可以帮忙吗?

这是一个简单的代码示例:

#include <iomanip>
#include <iostream>
using namespace std;
int main()
 {
  double a=1.000000000000020206059048177849 + 0.000000000000020206059048177849;
  cout<<fixed<<setprecision(30)<<a;
 system("pause");
 return 0;
 }

1 个答案:

答案 0 :(得分:1)

更新:下面的答案假设在运行时评估表达式,即您没有添加编译时常量。这不一定是真的,您的编译器可能会在编译期间评估表达式。它可能会使用更高的精度。正如评论中所建议的那样,打印出数字的方式可能是导致问题的根本原因。


如果你绝对需要更高的精确度并且不能做出任何其他的扭曲,你唯一的选择就是提高精确度。 double值提供大约16位十进制数的精度。您有以下选择:

  • 通过在软件中实现浮点运算,使用提供更高精度的库。这很慢,但您可以根据需要获得精确度,例如, GMP,GNU多精度库。

  • 另一种选择是使用long double,其至少与double一样精确。在某些平台上,long double甚至可能提供比double更高的精度,但一般情况下它不会。在典型的台式PC上,它可能是80位长(与64位相比),但这不一定是真的,取决于您的平台和编译器。它不便携。

也许,你可以避免麻烦并调整你的实现,以避免浮点错误。你可以重新安排运营吗?您的中间结果的格式为1+x。有没有办法计算x而不是1+x?当然,减去1不是一个选项,因为x的精度已经丢失。