我面临着以下代码的一个奇怪问题,
uint32 number = 1000000000;
number = number * pow(10, -9);
printf("number is %d\n", number);
我看到数字打印为“0”,而我希望数字为“1”。 有谁可以指出可能导致这种情况的原因?这是在MPC8248平台上。
提前致谢。
MK
答案 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
整数乘以浮点数?应该给出一个浮点数。 结果在整数变量中分配?浮点数被隐含地转换为整数???危险 !
至少使用圆形功能,如评论所示。
不要指望计算机中的数字艺术品与数学中的数字相同,就像你在学校里学到的那样(至少,不完全是这样)