为什么 C 中的 pow() 函数在循环中是 10 的奇数指数时给出错误答案?

use*_*396 3 c math loops pow

#include <stdio.h> 
#include <math.h>

int main()
{
    int loop, place_value=0, c = 5;
    for(loop = 0; loop < c; loop++)
    {
        place_value = 0;
        place_value = pow(10, loop);
        printf("%d \n", place_value);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码给出

10 
99 
1000 
9999 
Run Code Online (Sandbox Code Playgroud)

为什么第 3 行和第 5 行分别是 99 和 9999 而不是 100 和 10000?

正常求电时,给出正确答案。

#include <stdio.h>
#include <math.h>

int main()
{
  printf ("%d", (int) pow (10,3 ));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)
1000
Run Code Online (Sandbox Code Playgroud)

Eri*_*hil 5

pow是一个难以实现的例程,并不是所有的实现都能给出好的结果。粗略地说,核心算法pow(x, y)从 计算对数(的一部分)x,乘以y,然后计算乘积的指数函数。在浮点中执行此操作会引入难以控制的舍入误差。

结果是 的计算结果pow(10, 4)可能接近 10,000,但略小或略大。如果小于,则将其转换为整数会产生 9999。

当您在源代码中使用硬编码的参数时,编译器可能会在编译期间计算答案,可能使用不同的算法。例如,当y是 3 时,它可以简单地将第一个参数自乘,如x*x*x,而不是使用对数指数算法。

至于为什么您测试的奇数会出现低结果,请考虑当我们将 5.45454545 乘以 10 的各种幂并四舍五入为整数时会发生什么。5.45454545 向下舍入为 5。54.5454545 向上舍入为 55。545.454545 向下舍入为 545。向上或向下舍入是小数点以外的小数部分的结果。对于您的情况pow(10, loop),10 的对数位可能恰好用您尝试过的几个奇数给出了这种模式。

  • @user541396:由于您只是增量使用幂,因此从“int p = 1;”开始,并在循环的每次迭代中将“p”乘以十。 (3认同)
  • @user541396:也许令人惊讶的是,没有标准函数,但是 /sf/ask/7100761/ -int 描述了很多可能的选项。合理的第一种方法是一个简单的乘法循环,并对基数“0、1、-1”进行特殊处理。 (2认同)