考虑以下代码:

#include <iostream>
#include <cmath>

int main() {
    int i = 23;
    int j = 1;
    int base = 10;
    int k = 2;
    i += j * pow(base, k);
    std::cout << i << std::endl;
}

输出“122”而不是“123”。它是g++ 4.7.2(MinGW,Windows XP)中的错误吗?

最佳答案

std::pow() 使用没有无限精度的浮点数,并且可能您正在使用的标准库的实现以(较差的)方式实现pow(),这使得缺乏无限精度变得很重要。

但是,您可以轻松定义自己的整数版本。在C++ 11中,您甚至可以将其设置为constexpr(以便可以在编译时计算结果):

constexpr int int_pow(int b, int e)
{
    return (e == 0) ? 1 : b * int_pow(b, e - 1);
}

这是一个live example

尾递归形式(记入Dan Nissenbaum):
constexpr int int_pow(int b, int e, int res = 1)
{
    return (e == 0) ? res : int_pow(b, e - 1, b * res);
}

关于c++ - 为什么我的带有std::pow的整数数学给出错误的答案?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63830813/

10-12 00:21
查看更多