以更固定的方式将双精度加到双精度
Adding double to double in a more fixed way?
我在代码中使用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
的精度。
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 使用 Xcode 将双精度存储在数组C++中
- 在 C++ 中将双精度变量写入二进制文件
- 如何从字符串转换为双精度*
- 为什么我的数组双精度函数不起作用?
- 高精度双精度的 Sprintf 格式化问题
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 将指针数组分配给双精度
- 为什么可以使用指针创建新结构,但不能以相同的方式创建双精度?
- 以更固定的方式将双精度加到双精度