相關概念:可視化
(1)64位雙精度存儲,計算機存儲數據的類型之一,該存儲類型的一個存儲單元包括符號位,指數域,尾數域。循環
(2)符號位,對雙精度來講位於第64位,佔1個比特,表明數據是的正負,位於存儲單元的最高爲。二進制
(3)指數位,對雙精度來講位於第63位到第53位,佔11個比特,表明尾數的指數部分的二進制。另外爲了便於比較,該區域存儲的均爲非負值,將指數的實際值(-1023~1024)加上1023,因此得出存儲值的範圍是0~2047。方法
(4)尾數位,對雙精度來講位於第52位到第1位,將小數轉化爲二進制後,經過添加指數位使小數位轉化位1.****,其中正數1不佔據尾數位,做爲一個默認值,因此實際尾數位只是*******...*****(共52位)數據
0.1轉化爲二進制:計算機
0.1 * 2 = 0.2格式化
0.2 * 2 = 0.4
0.4 * 2 = 0.8
0.8 * 2 = 1.6
0.6 * 2 = 1.2
0.2 * 2 = 0.4
...
因此0.1的二進制小數位 0.00011001100...(1100循環),就是1.10011001100...(1100循環) * 2^-4,因此得出此時的存儲單元爲0(符號位)01111111011(指數位)1001100110011001100110011001100110011001100110011010(小數位最後一位是0舍1入得來的)。
0.2轉化位二進制:
0.2 * 2 = 0.4
0.4 * 2 = 0.8
0.8 * 2 = 1.6
0.6 * 2 = 1.2
0.2 * 2 = 0.4
....
因此0.2的二進制小數位0.00110011...(1100循環),就是1.10011001100...(1100循環) * 2^-3,因此得出此時的存儲單元爲0(符號位)01111111100(指數位)1001100110011001100110011001100110011001100110011010(小數位最後一位是0舍1入得來的)。
此時兩個數的存儲已經可視化了,接下來是運算+,首先須要將指數位轉化位同樣,規則是小轉大,因此小數位也會跟着變化。
0.1 -> 0.11001100...(1100循環) * 2^-3(第一個1是以前隱藏的整數位),開始運算。
0.1 + 0.2 =
0.11001100110011001100110011001100110011001100110011010(最後一位0超出捨棄)
+
1.1001100110011001100110011001100110011001100110011010
= 10.0110011001100110011001100110011001100110011001100111
將整數位10格式化位尾數位。
小數點左移一位:1.00110011001100110011001100110011001100110011001100111
去掉溢出的最後一位:1.0011001100110011001100110011001100110011001100110100(最後一位1,0舍1入獲得此值)
左移後指數域+1:01111111101
最終結果:0(符號位)01110010111(指數位)0011001100110011001100110011001100110011001100110100(尾數位) = 0.30000000000000004
另外一種方法,把小數換成二進制直接運算
0.1 -> 0.000110011001100110011001100110011001100110011001100110011
第一個1後只能有52位因此0舍1入後
0.1 -> 0.00011001100110011001100110011001100110011001100110011010
+
0.2 -> 0.0011001100110011001100110011001100110011001100110011001
= 0.010011001100110011001100110011001100110011001100110100(0舍1入)
注:0舍1入都是爲了使數據在小數位上只有52位。