1. 程式人生 > 其它 >Python 為什麼1.1 +2.2 等於3.3000000000000003

Python 為什麼1.1 +2.2 等於3.3000000000000003

技術標籤:Pythonpython資料分析補碼

Python 為什麼1.1 +2.2 等於3.3000000000000003

print(2.2 + 1.1)
>>> 3.3000000000000003

眾所周知,計算機只認識0和1兩種狀態,因此在機器位元組有限的情況下,浮點數的小數部分難免有誤差。eg:

用8個位元組表示0到1的小數。8個位元組儲存0和1共有256種狀態,因此它的最小分度為1 / 256 = 0.00390625。因此若遇到比0.00390625更小的刻度時就會產生誤差

如此,不防談一談雙精度浮點數在計算機內是如何儲存的。

一般Python和c中 計算機儲存遵從IEEE 754標準

在這裡插入圖片描述
sign 表示正負號 sign=0為正數,sign=1為負數。

exponent 指數 也叫階碼
fraction 尾數
總體就是科學計數法
在這裡插入圖片描述
移碼是指一個n+1位的數值,在真值基礎上加上一個2n的偏置值。
例如:一個八位數:x=(12)10=(0000 1100)2
[x]移=27+(0000 1100)2=1000 1100
但在浮點數的階碼中為了表示無窮大的數值,將移碼為全1的狀態空出來表示無窮大,故在階碼中的偏置值為2n-1,同時將移碼為全0的狀態空出來表示非規格化數。
即在長浮點數的儲存中,階碼E的取值為1~2046。
float型別的偏置值為127,double為1023