C - pow()奇怪的行为

时间:2014-01-11 02:07:44

标签: c floating-point floating-point-precision pow

我面临着以下代码的一个奇怪问题,

 uint32 number = 1000000000;
 number = number * pow(10, -9);
 printf("number is %d\n", number);

我看到数字打印为“0”,而我希望数字为“1”。  有谁可以指出可能导致这种情况的原因?这是在MPC8248平台上。

提前致谢。

MK

2 个答案:

答案 0 :(得分:3)

pow返回一个双精度数,并且使用双精度数,你必须始终担心精度。产品number * pow(...)可能不会完全 1.它可能是0.99或其他几乎为1但不完全的东西。当此值被分配回无符号整数number时,它将降级为int,并向下舍入为0.

要解决此问题,您始终可以使用整数实现自己的pow函数。不过,我建议使用long来实现,因为你的整数可以快速溢出(例如base = 50,exponent = 6很容易超过通常分配给int的32位)。

有关pow问题的详细信息,请参阅this SO question的答案。

等等,精确度是多少?

许多数字不能用有限二进制表示来表示。 float类型是一种这样的有限二进制表示。浮点数只能存储一定数量的信息(您可以将其视为精度),因此任何不适合的位都将被丢弃。这种信息丢失是浮点数可能出现这些错误的原因。您可以阅读有关此here的更多信息。

答案 1 :(得分:0)

number = number * SomeFloat

整数乘以浮点数?应该给出一个浮点数。  结果在整数变量中分配?浮点数被隐含地转换为整数???危险 !

至少使用圆形功能,如评论所示。

不要指望计算机中的数字艺术品与数学中的数字相同,就像你在学校里学到的那样(至少,不完全是这样)