c++ - 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
. 有谁知道这种差异的根源是什么?
解决方案
您的问题来自-(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 语句。
推荐阅读
- angular - 如何将@angular/fire 添加到 Nx 工作区(Angular 项目)?
- c# - C# 最佳实践 (LINQ) 检查字符串列表/数组中的字符串
- digital-ocean - 数字海滴
- javascript - 如何将excel文件(exceljs)上传到s3
- flutter - 使用 Flutter with IOS 接收共享文件意图
- javascript - 分页逻辑 - Vue
- javascript - 在 Node js 中不使用 Buffer 的情况下将字符串转换为 base64 的替代方法
- json - 我无法使用 Swift JSON 打印到 TableView 数据
- c# - VlcControl.TakeSnapshot 生成文件但为空
- android - Kotlin 使用协程处理改造请求