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
。有谁知道这种差异的根源是什么?
您的问题来自您对 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 语句。
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
。有谁知道这种差异的根源是什么?
您的问题来自您对 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 语句。