【问题标题】:C++ function std::pow() returns inf instead of a valueC++ 函数 std::pow() 返回 inf 而不是一个值
【发布时间】:2018-11-07 16:28:06
【问题描述】:

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

【问题讨论】:

  • Works here。你能提供一个minimal reproducible example吗?
  • @NathanOliver 你考虑过#include &lt;bits/stdc++.h&gt; 吗? *鸭子*
  • @LightnessRacesinOrbit 对不起,我不想成为炮灰:)
  • std::pow(1.0033333333333334, -360) -- 这行代码有 1) 没有分号,2) pow 的返回值没有分配给任何东西。那么这行代码到底是如何在你的程序中使用的呢?请发帖minimal reproducible example
  • @SebastianKucharzyk -- 这不是它在 SO 上的工作方式。您发布的代码不是minimal reproducible example。很快就会有 2 个 #include 语句、一个 int main() 和一个 cout 的值。请注意至少有 2 个人如何完成您应该完成的工作。

标签: c++ c++11 c++-standard-library cmath


【解决方案1】:

您的问题来自您对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 语句。

【讨论】:

  • 我想你领先了我几秒钟。
  • @SebastianKucharzyk 比“谢谢”评论更好,您可以单击答案分数下方的复选标记以接受它。
  • @YSC,是的,我点击了,但我还没有足够的声誉。我想当我获得更多积分时它会加给你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
相关资源
最近更新 更多