我遇到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
。有人知道这种差异的根源吗?
答案 0 :(得分:6)
您的问题来自调用-(m-period+1)
的{{1}}部分。 pow
被声明为
period
所以
unsigned int period = 1;
得到您的评价
-(m-period+1)
因此,您将 -(int - unsigned int + int)
== -(unsigned int)
作为360
来使用,当您对其求反时,它会回绕并变成非常大的数字(对于32位unsigned int
,4294966936
)。那意味着你在做
int
不是
1.0033333333333334 ^ 4294966936
您需要分别制作1.0033333333333334 ^ -360
和period
才能获得正确的结果。
如果您输入的数字一定不能为负,请不要使用无符号类型。 int
不会停止负数,只会将它们变成正数。如果要确保数字不是负数,请使用带符号的类型和if语句。