这是 IEEE 754 以标准化形式表示浮点数的方式的结果。float 或 double 或任何其他符合 IEEE 754 的表示形式存储如下:
1.xxxxxxxxxxxxxxxxxxx * 2^exp
其中xxxxxxxxxxxxxxxxxxx
是尾数的小数部分,因此尾数本身始终在 [1, 2) 范围内。始终为 1 的整数部分不存储在表示中。位数x
定义精度。它是 52 位double
。指数以偏移形式存储(必须减去 1023 才能获得它的值),但现在这无关紧要。
64 位 IEEE 754 中的 665857^4 是:
0 10001001100 (1)0100110100000001111100111011101010000101110010100010
+ exponent mantissa
(第一位是符号位:0 = 正,1 - 负;括号中的位并未真正存储)
在 80 位 x86 扩展精度中,它是:
0 10001001100 (1)0100110100000001111100111011101010000101110010100010
0 100000001001100 1 010011010000000111110011101110101000010111001010000111000111011
(这里的整数部分是表示的明确部分 - 与 IEEE 754 的偏差;为了清楚起见,我已对齐尾数)
64 位 IEEE 754 和 80 位 x86 扩展精度中的 4*470832^4 为:
0 10001001100 (1)0100110100000001111100111011101001111111010101100111
0 100000001001100 1 010011010000000111110011101110100111111101010110011100100010000
64 位 IEEE 754 和 80 位 x86 扩展精度中的 4*470832^2 为:
0 10000100110 (1)1001110011101010100101010100100000000000000000000000
0 100000000100110 1 100111001110101010010101010010000000000000000000000000000000000
将最后两个数字相加时,过程如下:调整较小值的指数以匹配较大值的指数,同时将尾数向右移动以保留该值。由于两个指数相差 38,因此较小数字的尾数向右移动 38 位:
470832^2*4 调整后的 64 位 IEEE 754 和 80 位 x86 扩展精度:
this bit came from 1.xxxx ------------------------------v
0 10001001100 (0)0000000000000000000000000000000000000110011100111010|1010
0 100000001001100 0 0000000000000000000000000000000000000110011100111010101001010101
现在这两个量具有相同的指数,它们的尾数可以相加:
0 10001001100 (1)0100110100000001111100111011101001111111010101100111|0010
0 10001001100 (0)0000000000000000000000000000000000000110011100111010|1010
--------------------------------------------------------------------------
0 10001001100 (1)0100110100000001111100111011101010000101110010100001|1100
我在栏的右侧保留了一些 80 位精度位,因为内部求和是以更高的 80 位精度完成的。
现在让我们在 64 位 + 80 位代表的一些位中执行减法:
minuend 0 10001001100 (1)0100110100000001111100111011101010000101110010100001|1100
subtrahend 0 10001001100 (1)0100110100000001111100111011101010000101110010100001|1100
-------------------------------------------------------------------------------------
difference 0 10001001100 (0)0000000000000000000000000000000000000000000000000000|0000
纯0!如果您以全 80 位执行计算,您将再次获得纯 0。
这里真正的问题是 1.0 不能以 2^77 的指数以 64 位精度表示 - 尾数中没有 77 位精度。对于 80 位精度也是如此 - 尾数中只有 63 位,在给定指数 2^77 的情况下,比表示 1.0 所需的少 14 位。
就是这样了!这只是科学计算的美妙世界,没有什么能像你在数学课上学到的那样工作......