16

在运行以下代码行时:

int i,a;    

for(i=0;i<=4;i++)  
{    
    a=pow(10,i);    
    printf("%d\t",a);    
}   

我很惊讶地看到输出,结果是 1 10 99 1000 9999而不是1 10 100 1000 10000.

可能的原因是什么?

注意
如果您认为在上述 for 循环中是浮点数不准确时i = 2,存储在变量中的a值为99

但如果你改为写

a=pow(10,2);

现在 a 的值变成了100。这怎么可能?

4

5 回答 5

22

您已设置aint. pow()生成一个浮点数,在某些情况下可能只是一根小于 100 或 10000 的头发(正如我们在此处看到的那样。)

然后将其填充到整数中,该整数将其截断为整数。所以你失去了那个小数部分。哎呀。如果您真的需要整数结果,round 可能是执行该操作的更好方法。

即使在那里也要小心,因为对于足够大的权力,错误实际上可能大到足以仍然导致失败,给你一些你意想不到的东西。请记住,浮点数仅具有如此高的精度。

于 2013-08-09T21:28:37.593 回答
13

该函数pow()返回一个double. 您将其分配给a类型为 variable int。这样做不会“四舍五入”浮点值,而是截断它。以 10^2 返回类似 99.99999... 的东西也是如此pow(),然后你只是扔掉了 .9999... 部分。不如说a = round(pow(10, i))

于 2013-08-09T21:30:10.670 回答
9

这与浮点不准确有关。尽管您传入ints 它们被隐式转换为浮点类型,因为该pow函数仅为浮点参数定义。

于 2013-08-09T21:27:18.423 回答
1

在数学上,整数的整数幂是整数。

在一个高质量的pow()例程中,这个特定的计算不应该产生任何舍入误差。我在 Eclipse/Microsoft C 上运行您的代码并得到以下输出:

1   10  100 1000    10000   

此测试不指示 Microsoft 是否使用浮点数和舍入,或者他们是否正在检测您的数字类型并选择适当的方法。

所以,我运行了以下代码:

#include <stdio.h>
#include <math.h>
main ()
{
    double i,a;

    for(i=0.0; i <= 4.0 ;i++)
    {
        a=pow(10,i);
        printf("%lf\t",a);
    }
}

并得到以下输出:

1.000000    10.000000   100.000000  1000.000000 10000.000000    
于 2013-08-09T22:48:25.523 回答
1

没有人详细说明如何真正正确地做到这一点 - 而不是pow函数,只是有一个跟踪当前功率的变量:

int i, a, power;    

for (i = 0, a = 1; i <= 4; i++, a *= 10) {    
    printf("%d\t",a);    
}

这种持续乘以 10 可以保证为您提供正确的答案,并且对于将十进制字符串转换为整数等任务来说非常好(并且比 pow 好得多,即使它给出了正确的结果)。

于 2017-06-28T21:34:39.303 回答