計算機沒有計算錯!是編碼時出現了誤差!
有小數點的數,是浮點數,在計算機中以IEEE754標準來儲存!
計算機中只能儲存有限位數的數!
100=0110 0100=2^6 *1.1001
100.00按IEEE754單精度浮點數表示,佔4個位元組的儲存單元。如下
100.00=0 10000101 1001 0000000000000000000
=0x42c80000(儲存到計算機的4個位元組)
以上這個數可以精確用計算機表示。
100.5,100.25,100.75,100.125,...,都可以用計算機精確表示。
但是,
-100.1=- 0110 0100.00011 00011 00011 00011 00011 ...(其中00011會無限迴圈下去)
而計算機只能儲存有限的數,按IEEE754單精度浮點數標準,c中的float型別,只能儲存4個位元組(32位)。如下
-100.1≈-2^6*1.100100 00011 00011 00011 00 (後邊的去掉了,保留小數點後有23位。如果後邊去掉的不全是0,就只能約等於了,就有誤差了。)
實際儲存的是
-100.09677124=-2^6*1.100100 00011 00011 00011 00 (後邊的去掉了,保留小數點後有23位)
=11000010110010000011000110001100
=0xc2c8318c(儲存到計算機的4個位元組)
用計算機不能表示-100.1這個數,實際儲存的數是接近這個數的數-100.09677124
儲存-100.1時就有誤差了!
所以
100.0+(-100.1)=-0.09677124 而不是-0.1。
為什麼我的計算與你的不一樣?
那是因為你的是用IEEE754雙精度表示的-100.1,精度更高,但也有誤差,就是c中的double float型別資料。
原理一樣,只是位數多,用8個位元組表示一個浮點數,你自己按IEEE754雙精度浮點數表示算一下吧。
計算機沒有計算錯!是編碼時出現了誤差!
有小數點的數,是浮點數,在計算機中以IEEE754標準來儲存!
計算機中只能儲存有限位數的數!
100=0110 0100=2^6 *1.1001
100.00按IEEE754單精度浮點數表示,佔4個位元組的儲存單元。如下
100.00=0 10000101 1001 0000000000000000000
=0x42c80000(儲存到計算機的4個位元組)
以上這個數可以精確用計算機表示。
100.5,100.25,100.75,100.125,...,都可以用計算機精確表示。
但是,
-100.1=- 0110 0100.00011 00011 00011 00011 00011 ...(其中00011會無限迴圈下去)
而計算機只能儲存有限的數,按IEEE754單精度浮點數標準,c中的float型別,只能儲存4個位元組(32位)。如下
-100.1≈-2^6*1.100100 00011 00011 00011 00 (後邊的去掉了,保留小數點後有23位。如果後邊去掉的不全是0,就只能約等於了,就有誤差了。)
實際儲存的是
-100.09677124=-2^6*1.100100 00011 00011 00011 00 (後邊的去掉了,保留小數點後有23位)
=11000010110010000011000110001100
=0xc2c8318c(儲存到計算機的4個位元組)
用計算機不能表示-100.1這個數,實際儲存的數是接近這個數的數-100.09677124
儲存-100.1時就有誤差了!
所以
100.0+(-100.1)=-0.09677124 而不是-0.1。
為什麼我的計算與你的不一樣?
那是因為你的是用IEEE754雙精度表示的-100.1,精度更高,但也有誤差,就是c中的double float型別資料。
原理一樣,只是位數多,用8個位元組表示一個浮點數,你自己按IEEE754雙精度浮點數表示算一下吧。