GCC C++ pow accuracy
GCC C++ pow accuracy
所以我在参加计算机竞赛时,注意到一个奇怪的错误。 pow(26,2) 总是返回 675,有时返回 674? 即使正确答案是 676。这些类型的错误也发生在 pow(26,3)、pow(26,4) 等身上。经过比赛后的一些调试,我相信答案与 int 向下舍入的事实有关。 有趣的是,我以前从未遇到过这种错误。我拥有的计算机在Windows 8上运行mingw。GCC 版本相当新,我相信是 2-3 个月大。但我发现,如果我在这种错误上转动 o1/o2/o3 优化标志,就会奇迹般地消失。pow(26,2) 总是会得到 676 又名正确答案 谁能解释为什么?
#include <cmath>
#include <iostream>
using namespace std;
int main() {
cout<<pow(26,2)<<endl;
cout<<int(pow(26,2))<<endl;
}
双打的结果很奇怪。
double a=26;
double b=2;
cout<<int(pow(a,b))<<endl; #outputs 675
cout<<int(pow(26.0,2.0))<<endl; # outputs 676
cout<<int(pow(26*1.00,2*1.00))<<endl; # outputs 676
该函数pow
对两个浮点值进行操作,并且可以将一个值提升到另一个浮点值。这是通过近似算法完成的,因为它需要能够处理从最小到最大的值。
由于这是一个近似算法,它有时会得到一个值有点错误。在大多数情况下,这是可以的。但是,如果您有兴趣获得确切的结果,请不要使用它。
我强烈建议不要将其用于整数。如果第二个操作数是已知的(在本例中为 2),则将其替换为执行速度更快并返回正确值的代码是微不足道的。例如:
template<typename T>
T square(T x)
{
return x * x;
}
回答实际问题:当一个或两个参数已知时,某些编译器可以将对pow
的调用替换为其他代码,或者一起消除它。这就解释了为什么你会得到不同的结果。
相关文章:
- 在C++中如何在没有pow的情况下进行基础计算
- 理解GCC中的std::pow实现
- 子例程,不使用 pow,并带有参数和返回
- 整数溢出,最大值为 pow(10,19)
- 在 while 循环中使用 pow() 函数 C++
- 在C++不使用 POW 的情况下处理负指数
- C++ 中 pow() 函数的输出没有给出准确的答案
- 没有匹配'pow'功能
- 为什么 while ((i <= 9) && square == pow(i, 2)) { cou
- Arduino Pow() 和 Armstrong 数问题
- C++在不使用pow或循环的情况下计算一个数字的幂
- 让constexpr在OSX上的C++17中使用pow
- Why (int)pow(2, 32) == -2147483648
- 错误:"int pow(double,int)"与上一个声明int pov(double a,int
- Pow 在 C++ 中无法按预期工作
- C++使用负矢量大小计算的 pow 行为
- 在C++中使用 pow() 时出错
- 如何修复 E2015 "ambiguity between pow(double,double) and pow(float,int)"
- constexpr exp, log, pow
- GCC C++ pow accuracy