以更固定的方式将双精度加到双精度

Adding double to double in a more fixed way?

本文关键字:双精度 方式      更新时间:2023-10-16

我在代码中使用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;
 }

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


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

  • 使用通过在软件中实现浮点运算来提供更高精度的库。这是缓慢的,但你可以得到你想要的精确,例如GMP, GNU多精度库。

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

也许,您可以避免这些麻烦并调整您的实现以避免浮点错误。你能重新排序操作吗?中间结果的格式为1+x。是否有一种方法来计算x而不是1+x ?当然,这里不能减去1,因为这样已经失去了x的精度。