你只能用 IEEE754 精确地表示数字(至少对于单精度和双精度二进制格式),如果它们可以通过将两个的倒数相加来构造(即,2<sup>-n</sup>,如1,1/2, 1/4、1/65536 等)取决于可用于精度的位数。
在浮点数(23 位精度)或双倍(52 位精度)提供的缩放比例范围内,没有任何组合可以让您精确到 101.1。 p>
如果您想快速了解这种二次幂的工作原理,请参阅this answer。
将该答案中的知识应用于您的101.1 数字(作为单精度浮点数):
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 1/n
0 10000101 10010100011001100110011
| | | || || || |+- 8388608
| | | || || || +-- 4194304
| | | || || |+----- 524288
| | | || || +------ 262144
| | | || |+--------- 32768
| | | || +---------- 16384
| | | |+------------- 2048
| | | +-------------- 1024
| | +------------------ 64
| +-------------------- 16
+----------------------- 2
其中的尾数部分实际上一直持续到 101.1:
mmmmmmmmm mmmm mmmm mmmm mm
100101000 1100 1100 1100 11|00 1100 (and so on).
因此,这不是精度问题,没有多少有限位可以准确地以 IEEE754 格式表示该数字。
使用位来计算实际数(最接近的近似值),符号为正。指数为 128+4+1 = 133 - 127 偏差 = 6,因此乘数为 26 或 64。
尾数由 1(隐式基数)加上(对于所有这些位,每个位值 1/(2n),因为 n 从 1 开始并向右增加),@987654332 @。
当你把所有这些加起来,你会得到1.57968747615814208984375。
当您将其乘以之前计算的乘数 64 时,您会得到 101.09999847412109375。
所有数字都是用bc 使用 100 位小数的比例计算的,导致很多尾随零,因此数字应该非常准确。更重要的是,因为我检查了结果:
#include <stdio.h>
int main (void) {
float f = 101.1f;
printf ("%.50f\n", f);
return 0;
}
也给了我101.09999847412109375000...。