加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:22:10 所属栏目:百科 来源:网络整理
导读:我有std :: pow()返回值的问题.基本上,我在代码中有以下行: #include cmathint main(){ double rate = 1.0033333333333334; int m = 360; unsigned int period = 1; double res = std::pow(rate,-(m-period+1));} res的值为inf.但是,当我在调试时将std :: p
我有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

解决方法

你的问题来自你对pow的调用的 – (m-period 1)部分.期间被宣布为

unsigned int period = 1;

所以什么时候

-(m-period+1)

得到你的评价

-(int - unsigned int + int)
== -(unsigned int)

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

1.0033333333333334 ^ 4294966936

1.0033333333333334 ^ -360

您需要创建句点和int才能获得正确的结果.

如果您的数字不能为负数,请不要使用无符号类型.没有任何关于unsigned的停止负数,它只是将它们变成正数.如果要确保数字不是负数,请使用带符号的类型和if语句.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读