我在我的代码中使用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;
}
答案 0 :(得分:1)
更新:下面的答案假设在运行时评估表达式,即您没有添加编译时常量。这不一定是真的,您的编译器可能会在编译期间评估表达式。它可能会使用更高的精度。正如评论中所建议的那样,打印出数字的方式可能是导致问题的根本原因。
如果你绝对需要更高的精确度并且不能做出任何其他的扭曲,你唯一的选择就是提高精确度。 double
值提供大约16位十进制数的精度。您有以下选择:
通过在软件中实现浮点运算,使用提供更高精度的库。这很慢,但您可以根据需要获得精确度,例如, GMP,GNU多精度库。
另一种选择是使用long double
,其至少与double
一样精确。在某些平台上,long double
甚至可能提供比double
更高的精度,但一般情况下它不会。在典型的台式PC上,它可能是80
位长(与64
位相比),但这不一定是真的,取决于您的平台和编译器。它不便携。
也许,你可以避免麻烦并调整你的实现,以避免浮点错误。你可以重新安排运营吗?您的中间结果的格式为1+x
。有没有办法计算x
而不是1+x
?当然,减去1
不是一个选项,因为x
的精度已经丢失。