【问题标题】:Pow not working as expected in c++ [duplicate]Pow 在 C++ 中无法按预期工作 [重复]
【发布时间】:2018-07-08 18:10:12
【问题描述】:

大家好,我已经使用 c++ 工作了很长时间,这是一个困扰我的问题。

我尝试评估 pow(2,30),但答案是这样的 1.07374e+009, 而不是预期的整数形式 1073741824。我尝试将其转换为 int 或 很长,但问题是,它有时会将其截断为较低的值。为了 例如,1073741824 有时会被截断为 1073741823。我该怎么办?此外,如果数字不是 2,应该如何确保以正确的格式得到答案。

【问题讨论】:

  • 首先取决于你的输出方式。以您想要的方式定义格式。其次是由于精度。
  • std::pow 总是产生浮点数、双精度数或长双精度数,无论输入类型如何。
  • 方便阅读:Is floating point math broken? TL;DR 版本:结果可能类似于 1073741823.99999999。转换为分数的整数循环而不是执行任何智能舍入。

标签: c++ casting integer pow truncation


【解决方案1】:

如果您确定总是计算 2 的幂。使用左移运算符会更好,因为与 pow() 函数相比,它非常有效。看看这个sn-p。它就像魅力一样。

#include <iostream>

int main()
{
    long pow_value = (1L << 30); //Equivalent to calculating 2^30
    printf("%ld",pow_value);

    return 0;
}

【讨论】:

  • 想法不错,但一个好的答案除了提供替代方案外,还需要解释问题所在。
  • 用户面临的行为是浮点运算所期望的。用户最好使用替代整数版本来计算幂。
  • 顺便说一下,1 &lt;&lt; 30 (或1L &lt;&lt; 30 我的编辑)周围不需要括号。
  • 我明白了,但如果数字不是两个我该怎么办。直到现在还没有人给我答案。 :(
  • 感谢您的编辑。 @PeteBecker 这个逻辑不仅适用于 2,它适用于所有的二次幂,2^30 == 4^28 = 8^27。但是,如果您有任何其他号码,您可以在问题The most efficient way to implement an integer based power function pow(int, int) 中使用逻辑
【解决方案2】:

pow() 仅适用于浮点数,当您输出较大的浮点数时,&lt;&lt; 运算符会自动以科学计数法打印。将其转换为整数类型将不起作用,因为浮点数不是 100% 精确并且具有floating point error。

如果您只需要 2 的幂,则可以使用位移。 a &lt;&lt; b 等于 a 乘以 2 的 bth 次方。向左移动将其乘以二进制的 2 的幂,就像移动小数点将数字乘以十进制的 10 的幂一样。如果你需要其他基地的权力,你可以使用来自this post的东西。

【讨论】:

    猜你喜欢
    • 2020-04-23
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多