您只能在 IEEE754 中精确地表示数字(至少对于单精度和双精度二进制格式),如果它们可以通过将两个的倒幂(即,如、、等)相加来构造,则取决于可用的位数为了精确。2-n
1
1/2
1/4
1/65536
在浮点数(23 位精度)或双精度数(52 位精度)提供的缩放比例范围内,没有两个的倒幂组合可以让您精确到 101.1 。
如果您想要快速教程了解这种倒置的二次幂的工作原理,请参阅此答案。
将该答案中的知识应用于您的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,因此乘数为 2 6或 64。
尾数由 1(隐式基数)加上(对于所有这些位,每个位值 1/(2 n ),因为 n 从 1 开始并向右增加){1/2, 1/16, 1/64, 1/1024, 1/2048, 1/16384, 1/32768, 1/262144, 1/524288, 1/4194304, 1/8388608}
,。
当你把所有这些加起来时,你得到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...
。