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

Seb*_*zyk 3 c++ cmath c++-standard-library c++11

我有一个返回值的问题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));
}
Run Code Online (Sandbox Code Playgroud)

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

请参阅http://coliru.stacked-crooked.com/a/ec78c5172cf53e03

Nat*_*ica 7

您的问题来自-(m-period+1)您的通话部分pow. period被宣布为

unsigned int period = 1;
Run Code Online (Sandbox Code Playgroud)

所以什么时候

-(m-period+1)
Run Code Online (Sandbox Code Playgroud)

得到你的评价

   -(int - unsigned int + int)
== -(unsigned int)
Run Code Online (Sandbox Code Playgroud)

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

1.0033333333333334 ^ 4294966936
Run Code Online (Sandbox Code Playgroud)

1.0033333333333334 ^ -360
Run Code Online (Sandbox Code Playgroud)

您需要制作periodint获得正确的结果.


如果您的数字不能为负数,请不要使用无符号类型.没有什么可以unsigned阻止负数,它只是把它们变成一个正数.如果要确保数字不是负数,请使用带符号的类型和if语句.

  • @SebastianKucharzyk比"谢谢"评论更好,你可以在答案分数下用复选标记来接受它. (2认同)