在C++中使用 pow 时精度损失
Loss of precision when using pow in C++
>10^1.64605 = 44.2639330165
但是,在使用pow
C++
double p = pow(10,1.64605) returns 44.2641.
有没有办法提高这里的精度?我试着把两边都投long double
但这也无济于事。
更有趣的是:
cout<<p;
double a = -1.64605;
cout<<pow(10,-a);
p = pow(10, (-p));
cout<<p;
输出为:
-1.64605
44.2639
44.2641
为什么?
cout
截断双精度值以进行显示,但pow
计算的值可能至少与您预期的一样精确。有关如何在控制台中显示的更高精度,请参阅:
如何使用 cout 以全精度打印双精度值?
我会详细说明大卫的催促。
你说double p = pow(10,1.64605) returns 44.2641
但这是不正确的。它返回 44.26393301653639156;在没有任何格式说明符的情况下,这将显示为 44.2639(稍后会看到)。
当您在第二个代码截图中cout
p
的原始值时,它显示为-1.64605
(由于精度降低的格式),并且您假设它正好是 -1.64605,而实际上介于 -1.64605115... 和 -1.64605213...,在表达式中计算为 44.2641 cout << pow(10, (-p));
答案将通过检查p
找到。您没有显示它是如何初始化的。
您会发现p != a
,即使您将它们打印到控制台时它们看起来相同。打印到控制台时,仅打印前 6 个有效的十进制数字。以更高的精度打印这两个值,您将看到它们不相等。
你说:
double p = pow(10,1.64605);
评估为 44.2641
.但事实并非如此。如果你实际执行该代码,你会看到它。
double p = pow(10,1.64605);
cout << p;
输出44.2639
.
您的代码与上面的代码略有不同。是的:
cout << p;
p = pow(10, (-p));
cout << p;
将p
的原始值输出到全精度,所有内容都将显示出来。
相关文章:
- int 到浮点转换的精度损失
- 禁止具有精度损失的整数转换
- 添加双精度时精度损失
- ceil、floor 和 round 在转换为整数时会遇到精度损失问题吗?
- 精度损失
- 精度损失(分配)
- 在C++中使用 pow 时精度损失
- 从浮子到双精度,从双精度到浮子的精度损失
- 处理在减去两个彼此接近的双精度时的精度损失
- 精度损失
- 在C++中将双精度转换为字符串时精度损失
- 在C++中标记双精度损失的算法不会标记正确的位置
- 如果可以接受一些精度损失,如何快速紧凑地保存双精度矩阵
- 编译器不会警告精度损失
- 这种精度损失发生在哪里以及如何防止
- 添加双精度时精度损失
- 不投影和重投影的精度损失
- 计算幅度 <1 和幅度 >1 时的精度损失
- 从Int到Float到Int的转换精度损失
- 使用double时精度损失