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

时间:2018-11-07 16:28:06

标签: c++ c++11 c++-standard-library cmath

我遇到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

1 个答案:

答案 0 :(得分:6)

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

period

所以

unsigned int period = 1;

得到您的评价

-(m-period+1)

因此,您将 -(int - unsigned int + int) == -(unsigned int) 作为360来使用,当您对其求反时,它会回绕并变成非常大的数字(对于32位unsigned int4294966936)。那意味着你在做

int

不是

1.0033333333333334 ^ 4294966936

您需要分别制作1.0033333333333334 ^ -360 period才能获得正确的结果。


如果您输入的数字一定不能为负,请不要使用无符号类型。 int不会停止负数,只会将它们变成正数。如果要确保数字不是负数,请使用带符号的类型和if语句。