据我所知,单精度浮点数的符号为1位,指数为8位,尾数为23位。
我可以理解,7位整数适合23位尾数而且不会松动精度,但无法理解像1234567000000000这样的数字如何在没有松散的情况下如何拟合" 1,2,3,4,5 ,6,7-"数字,这背后的数学是什么?
答案 0 :(得分:2)
IEEE-754基本32位二进制浮点格式仅保证六位有效十进制数字将在往返转换中存活,而不是七位。具体来说:如果使用正确的舍入到最接近的舍入将使用十位十进制数字精确表示的数字乘以十进制格式转换为二进制格式,并且没有上溢或下溢,然后转换回最近的数字代表六位十进制数乘以十次幂,结果将是原始数字。
通常,当十进制数字转换为二进制浮点数时,结果在以十进制形式写入时可能不会具有相同的数字。您的示例1234567000000000转换为1234567008616448,但我们可能会发现某些情况,其中123456000 ...转换为123455900 ...,因此其中一个原始数字是不同的。但是二进制格式提供的精度使得转换为二进制格式的结果总是如此接近原始值,使得差值永远不会超过第六个数字的位置值的一半。例如,转换123456000 ...将始终产生123455500 ...和123456500之间的结果...由于第一次转换的结果始终在这样的时间间隔内,将其转换回六位小数,并进行舍入,始终生成原始数字。
为了保证这一点,格式的精度必须与999999中的一部分一样精细。那是因为二进制格式的数字是如此精细的间隔,以至于在9999985的间隔中至少有一个...到9999995 ...,所以从十进制转换为二进制的结果可以产生足够接近原始的结果,转换回产生原始值。在有效数字中有24位(一个隐含,23个显式),精度至少是2 23 中的一部分,即8,388,608。 (有效数字可以达到16,777,215,但我们没有选择它 - 它必须被标准化,这使它保持在8,388,608到16,777,215的范围内。)
8,388,608中的一部分优于999,999中的一部分,因此可以保证六位数,但不会比9,999,999中的一位更好,因此不能保证七位数。
答案 1 :(得分:0)
[我]无法理解像1234567000000000这样的数字如何在没有松散的情况下如何适应" 1,2,3,4,5,6,7"数字,这背后的数学是什么?
我不太明白你的理由。无论如何,这里有1234567000000000将如何转换为IEEE-754 binary32(又名。single,又称C中的浮点数):
1.09651577472686767578125 * 2**50
指数应用偏差(-127),尾数和指数在基数2中编码,尾数的第一位被删除,因为它总是1。
自己检查https://babbage.cs.qc.cuny.edu/IEEE-754/
正如您所注意到的,转换为float
后的十进制值不等于1234567000000000,但大约为1234567008616448,您可以看到前7位匹配。
由于用于编码尾数的位数有限(由于转换为基数2),精度损失发生在较低有效位中。
答案 2 :(得分:0)
我看到这样的数学证明:
-log10(2^(-24)) = 7.225
24表示在点之前加1。如果未在该点前加上1:
-log10(2^(-23)) = 6.9