在C中,float或double类型是如何工作的?

时间:2016-10-15 05:46:42

标签: c floating-point precision c99

现在我在大学学习C语言。我在浮点类型中输入了一个意外的行为。

这是示例代码:

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

真实的结果是33.3(有3个周期)。我也知道机器只能存储有理数的数字,对我来说还可以,所以我预期的答案可能是:

  • 33.33333 2 00000000000000(刚刚舍入)

最多

  • 33.33333 4 00000000000000(向上舍入)
  • 33.33333 2 00000000000000(向下舍入)
  • 33.33333 0 00000000000000(刚截断)

但在执行(用GCC编译)后,结果是33.333332 061767578 00000 ...

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

为什么会这样?我搜索了很多,我一无所获:(

1 个答案:

答案 0 :(得分:2)

要查看存储的确切值,您应该打印超过20位数字。该号码应以75000…25000…结尾。

假设您使用的是IEEE 754的实现,每个float的格式为num / den,其中num有24个二进制(!)数字,den是2.除了非规范化数字,但这是另一个主题。)