C++ 函数 std::pow() returns inf 而不是值

C++ function std::pow() returns inf instead of a value

std::pow() 的返回值有问题。基本上,我在代码中有以下行:

#include <cmath>
int main()
{
     double rate = 1.0033333333333334;
     int m = 360;
     unsigned int period = 1;
     double res = std::pow(rate, -(m-period+1));
}

而 res 的值为 inf。但是,当我在调试时将 std::pow(rate, -(m-period+1)) 粘贴到 Visual Studio watch 时,它的正确值为 0.30179586515268314。有谁知道这种差异的根源是什么?

http://coliru.stacked-crooked.com/a/ec78c5172cf53e03

您的问题来自您对 pow 的调用的 -(m-period+1) 部分。 period 声明为

unsigned int period = 1;

所以当

-(m-period+1)

得到评估你有

   -(int - unsigned int + int)
== -(unsigned int)

所以你得到 360 作为 unsigned int 并且当你否定它时,它环绕并变成一个非常大的数字(4294966936 对于 32 位 int ).那意味着你在做

1.0033333333333334 ^ 4294966936

没有

1.0033333333333334 ^ -360

您需要将 period 设为 int 才能获得正确的结果。


如果您有一个不能为负数的数字,请不要使用无符号类型。 unsigned 不会阻止负数,它只是将负数变成正数。如果您想确保数字不是负数,请使用带符号的类型和 if 语句。