pow功能的奇怪行为

时间:2013-08-09 21:25:03

标签: c pow

运行以下代码行时:

int i,a;    

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

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

可能的原因是什么?

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

但如果你改为写

99

现在a的值为a=pow(10,2); 。怎么可能?

5 个答案:

答案 0 :(得分:17)

我甚至不能拼写c,但我可以告诉你为什么。

您已将a设为intpow()生成一个浮点数,在某些情况下可能只是一个小于100或10000的头发(正如我们在这里看到的那样)。

然后将其填入整数,其中TRUNCATES为整数。所以你失去了那个小部分。哎呀。如果你真的需要整数结果,那么round可能是更好的方法来进行操作。

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

答案 1 :(得分:10)

函数pow()返回double。您将其分配给a类型的变量int。这样做不会“舍入”浮点值,它会截断它。所以pow()返回类似于99.99999的东西......为10 ^ 2,然后你就扔掉了.9999 ...部分。最好说a = round(pow(10, i))

答案 2 :(得分:8)

这与floating point inaccuracy有关。虽然您传入的是int,但它们被隐式转换为浮点类型,因为pow函数仅为浮点参数定义。

答案 3 :(得分: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    

答案 4 :(得分:1)

没有人详细说明如何实际正确地执行 - 而不是pow功能,只需要一个跟踪当前功率的变量:

int i, a, power;    

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

这种持续乘以10可以保证为你提供正确的答案,并且对于像将十进制字符串转换为整数这样的任务而言,相当好(并且比pow更好,即使它给出了正确的结果)。