2016-10-15 31 views
-2

现在我在大学学习C语言。我发现了一个浮动类型的意外行为。在C中,float或double类型是如何工作的?

这是示例代码:

#include <stdio.h> 
int main(void) { 
    float f = 100.0/3; 
    printf("%.20f", f); 
} 

真正结果是33.3(用3周期的)。我也知道,机器只能存储有理数对我来说是好的,所以我预计answars可能是:

  • 33.33333 00000000000000(只是四舍五入)

最多

  • 33.33333 00000000000000(四舍五入)
  • 33.33333 00000000000000(四舍五入)
  • 33.33333 00000000000000(只截断)

但执行(使用GCC编译)后的结果为33.333332 00000 ...

的数字( )2之后无法在我脑海中解释。

为什么会这样?我搜索了很多,我什么也没找到:(

+2

[IEEE 754](HTTPS ://en.wikipedia.org/wiki/IEEE_floating_point) – tkausl

+1

这是最接近的数字33.3(循环),可以表示在f游荡点格式。舍入发生在二进制中,而不是十进制,因此舍入将不对应于十进制表示中的单个最终数字。 – samgak

+0

@ShadowRanger OP在哪里指定了754?标签不应该在那里。 – 2501

回答

2

要查看存储的精确值,你应该打印超过20位的数字,该数字应与75000…25000…结束。

假设你正在使用的实现IEEE 754,每个float的形式num/den,其中num有24个二进制(!),数字和den是2的幂(除正规化数,但那是另一个话题。)

+1

关闭1:其中'num'有24个二进制数字。 (23明确编码,1暗示)[重要性和精确性:24位(23明确存储)](https://en.wikipedia.org/wiki/Single-precision_floating-point_format#IEEE_754_single-precision_binary_floating-point_format:_binary32) – chux

相关问题