use*_*257 21 c++ floating-point g++
考虑以下代码:
#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)中的错误吗?
And*_*owl 10
std::pow()使用浮点数,它没有无限的精度,可能你正在使用的标准库的实现pow()以(差)方式使得缺乏无限精度变得相关.
但是,您可以轻松定义适用于整数的自己的版本.在C++ 11中,您甚至可以创建它constexpr(以便在可能的情况下在编译时计算结果):
constexpr int int_pow(int b, int e)
{
    return (e == 0) ? 1 : b * int_pow(b, e - 1);
}
这是一个实例.
尾递归形式(Dan Nissenbaum学分):
constexpr int int_pow(int b, int e, int res = 1)
{
    return (e == 0) ? res : int_pow(b, e - 1, b * res);
}
到目前为止,所有其他答案都错过或围绕问题中唯一的一个问题跳舞:
在pow你的C ++实现的质量不高。当没有必要时,它会返回一个不准确的答案。
获得更好的 C++ 实现,或者至少替换其中的数学函数。Pascal Cuoq 指出的那个很好。
至少我的没有:
$ g++ --version | head -1
g++ (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)
$ ./a.out 
123
IDEone也运行版本 4.7.2 并提供123.
签名pow()来自http://www.cplusplus.com/reference/cmath/pow/
     double pow (      double base,      double exponent );
long double pow ( long double base, long double exponent );
      float pow (       float base,       float exponent );
     double pow (      double base,         int exponent );
long double pow ( long double base,         int exponent );
您应该设置double base = 10.0;和double i = 23.0。
| 归档时间: | 
 | 
| 查看次数: | 4368 次 | 
| 最近记录: |