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 。 你将它分配给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转换为整数的任务。