猿问

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,存储在变量中的值。a99.

但如果你改写

a=pow(10,2);

现在,a的价值出来了100..那件事怎么可能?


aluckdog
浏览 529回答 3
3回答

翻阅古今

我甚至不会拼写c,但我可以告诉你原因。你已经a做一个int.&nbsp;pow()生成一个浮点数,在某些情况下可能只是一个小于100或10000的头发(正如我们在这里看到的)。然后将其填充到整数中,该整数截断为整数。所以你失去了小数部分。哎呀。如果您确实需要一个整数结果,则圆形可能是执行该操作的更好方法。即使是在那里,也要小心,因为足够大的力量,这个错误可能真的很大,仍然会导致失败,给你一些你不期望的东西。请记住,浮点数只具有如此高的精度。

守着一只汪

功能pow()返回double..你把它分配给变量a,类型int..这样做并不能“舍入”浮点值,它会截断浮点值。所以pow()会退回大约99.99999.为了10^2,然后你就扔掉了.9999.部分。更好地说a = round(pow(10, i)).

慕森卡

从数学上讲,整数的整数幂是整数。质量好pow()例程这个特定的计算不应产生任何舍入错误.我在Eclipse/MicrosoftC上运行了您的代码,并获得了以下输出:1&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;100&nbsp;1000&nbsp;&nbsp;&nbsp;&nbsp;10000此测试并不表示Microsoft是否在使用浮点数和舍入,或者它们是否检测到数字的类型并选择适当的方法。因此,我运行了以下代码:#include&nbsp;<stdio.h>#include&nbsp;<math.h>main&nbsp;(){ &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;i,a; &nbsp;&nbsp;&nbsp;&nbsp;for(i=0.0;&nbsp;i&nbsp;<=&nbsp;4.0&nbsp;;i++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a=pow(10,i); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%lf\t",a); &nbsp;&nbsp;&nbsp;&nbsp;}}得到了以下输出:1.000000&nbsp;&nbsp;&nbsp;&nbsp;10.000000&nbsp;&nbsp;&nbsp;100.000000&nbsp;&nbsp;1000.000000&nbsp;10000.000000
随时随地看视频慕课网APP
我要回答