代码
float x = 3.141592653589793238;
double z = 3.141592653589793238;
printf("x=%f\n", x);
printf("z=%f\n", z);
printf("x=%20.18f\n", x);
printf("z=%20.18f\n", z);
会给你输出
x=3.141593
z=3.141593
x=3.141592741012573242
z=3.141592653589793116
在第三行输出处的位置741012573242
是垃圾,在第四行116
是垃圾。双打总是有16个重要数字,而浮子总是有7个重要数字?为什么双打没有14个重要数字?
答案
C中的浮点数使用IEEE 754编码。
这种类型的编码使用符号,一个显着性和指数。
由于此编码,许多数字将具有很小的更改以允许它们存储。
同样,由于它是二进制表示,而不是十进制的数字,因此重要数字的数量可能会稍微改变。
单个精度(浮点)为您提供23位显着的,8位指数和1个符号位。
双精度(双重)为您提供52位显着性,11位指数和1个符号位。