考虑以下代码:
#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/