pow函数的奇怪行为

运行以下代码行时:

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 ,存储在variablesa的值是99

但是,如果你写,而不是

 a=pow(10,2); 

现在的价值出来是100 。 这怎么可能?

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

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

然后你把它填充到整数,TRUNCATES到一个整数。 所以你失去了这个小数部分。 哎呀。 如果你真的需要一个整数结果,那么round可能是一个更好的方法来做这个操作。

即使在那里也要小心,至于足够大的权力,错误可能实际上足够大,仍然会导致失败,给你一些你不希望的东西。 请记住,浮点数只有这么高的精度。

这是与浮点不准确 。 虽然你正在传入int s,但由于pow函数只是为浮点参数定义的,所以它们被隐式转换为浮点types。

函数pow()返回一个double 。 你将它分配给inttypes的variablesa 。 这样做并不会“浮现”浮点值,它会截断它。 所以pow()返回类似99.99999 … 10 ^ 2,然后你只是扔掉.9999 …部分。 更好地说a = round(pow(10, i))

在math上,整数的整数次幂是一个整数。

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

 1 10 100 1000 10000 

这个testing并不表示微软是使用浮点数还是四舍五入,或者他们是否正在检测数字的types并select合适的方法。

所以,我跑了下面的代码:

 #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 

没有人详细说明如何正确地做到这一点 – 而不是powfunction,只是有一个跟踪当前功率的variables:

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

这个继续乘以十是保证给你正确的答案,并且相当可以(比pow更好,即使它给出了正确的结果)用于将十进制string转换为整数的任务。