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,但我可以告诉你为什么。
你已经设置为一个int
。 pow()
产生一个浮点数,在某些情况下可能只是一个小于100或10000的头发(正如我们在这里看到的)。
然后你把它填充到整数,TRUNCATES到一个整数。 所以你失去了这个小数部分。 哎呀。 如果你真的需要一个整数结果,那么round可能是一个更好的方法来做这个操作。
即使在那里也要小心,至于足够大的权力,错误可能实际上足够大,仍然会导致失败,给你一些你不希望的东西。 请记住,浮点数只有这么高的精度。
这是与浮点不准确 。 虽然你正在传入int
s,但由于pow
函数只是为浮点参数定义的,所以它们被隐式转换为浮点types。
函数pow()
返回一个double
。 你将它分配给int
types的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
没有人详细说明如何正确地做到这一点 – 而不是pow
function,只是有一个跟踪当前功率的variables:
int i, a, power; for (i = 0, a = 1; i <= 4; i++, a *= 10) { printf("%d\t",a); }
这个继续乘以十是保证给你正确的答案,并且相当可以(比pow更好,即使它给出了正确的结果)用于将十进制string转换为整数的任务。