pow功能的奇怪行为

Kro*_*ngh 13 c pow

运行以下代码行时:

int i,a;    

for(i=0;i<=4;i++)  
{    
    a=pow(10,i);    
    printf("%d\t",a);    
}   
Run Code Online (Sandbox Code Playgroud)

我很惊讶地看到输出,它出来了 1 10 99 1000 9999而不是1 10 100 1000 10000.

可能的原因是什么?

注意
如果您认为它是浮点不准确,在上面的for循环中i = 2,存储在变量中的值a99.

但如果你写的话

a=pow(10,2);
Run Code Online (Sandbox Code Playgroud)

现在a的价值出现了100.怎么可能?

小智 17

我甚至不能拼写c,但我可以告诉你原因.

你已经a成为了一个int.pow()生成一个浮点数,在某些情况下可能只是一个小于100或10000的头发(正如我们在这里看到的那样).

然后你将它填入整数,TRUNCATES为整数.所以你失去了那个小部分.哎呀.如果您确实需要整数结果,则round可能是执行该操作的更好方法.

即使在那里也要小心,因为足够大的功率,错误实际上可能足够大,仍然会导致失败,给你一些你不期望的东西.请记住,浮点数只能带来如此高的精度.

  • 是的,重要的是转换为`int`就像这样截断而不是舍入. (3认同)
  • @MayankJha**不是**要求******是错误的.这是唯一可能的.对于某些值. (2认同)
  • @MayankJha:因为在处理浮点数时,不要求常量文字与具有相同值的变量具有相同的舍入精度.因此,编译器可以在编译时以更高的精度自由地计算常量表达式,并获得稍微不同的结果,最终与truncate非常不同. (2认同)

Lee*_*ker 11

该函数pow()返回一个double.您将其分配给a类型的变量int.这样做不会"舍入"浮点值,它会截断它.所以pow()返回类似于99.99999的东西...为10 ^ 2,然后你只是扔掉.9999 ...部分.更好的说法a = round(pow(10, i)).


DrY*_*Yap 8

这与浮点不准确有关.虽然您传入ints,但它们被隐式转换为浮点类型,因为该pow函数仅针对浮点参数定义.

  • 你链接的文章描述了浮点数的表示及其背后的一些原理,但这里没有关系,因为`pow(10,2)`的参数和结果都可以完全表示为`double` .相反,OP正在使用`pow()`的低级实现,这是本文未提及的主题. (7认同)