首页 > 解决方案 > C++ 函数 std::pow() 返回 inf 而不是值

问题描述

我的返回值有问题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 手表时,它的正确值为0.30179586515268314. 有谁知道这种差异的根源是什么?

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

标签: c++c++11c++-standard-librarycmath

解决方案


您的问题来自-(m-period+1)您对pow. 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 语句。


推荐阅读