回覆列表
  • 1 # 使用者9881409369732

    計算機沒有計算錯!是編碼時出現了誤差!

    有小數點的數,是浮點數,在計算機中以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雙精度浮點數表示算一下吧。

  • 中秋節和大豐收的關聯?
  • 張飛在長坂坡吼了一句什麼話,嚇死了曹軍一名將軍,求解?