运行以下代码行时:
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);
。怎么可能?
答案 0 :(得分:17)
我甚至不能拼写c,但我可以告诉你为什么。
您已将a
设为int
。 pow()
生成一个浮点数,在某些情况下可能只是一个小于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更好,即使它给出了正确的结果)。