tft每日頭條

 > 圖文

 > 為什麼浮點數表示範圍更大

為什麼浮點數表示範圍更大

圖文 更新时间:2025-01-13 14:09:30

為什麼浮點數表示範圍更大?1、什麼是浮點數?我們知道,數學中并沒有浮點數的概念,雖然小數看起來像浮點數,但從不這麼叫那為什麼計算機中不叫小數而叫浮點數呢?,我來為大家科普一下關于為什麼浮點數表示範圍更大?以下内容希望對你有幫助!

為什麼浮點數表示範圍更大(為什麼計算機中不叫小數而叫浮點數)1

為什麼浮點數表示範圍更大

1、什麼是浮點數?

我們知道,數學中并沒有浮點數的概念,雖然小數看起來像浮點數,但從不這麼叫。那為什麼計算機中不叫小數而叫浮點數呢?

因為資源的限制,數學中的小數無法直接在計算機中準确表示,為了更好地表示它,計算機科學家們發明了浮點數,這是對小數的近似表示。

2、IEEE754是什麼?

知道了浮點數的概念,但需要确定一套具體的表示、運算标準,其中最有名的就是IEEE754标準。

本文的讨論都基于IEEE754标準,這也是目前各大編程語言和硬件使用的标準。

3、浮點數的構成

浮點數是指用符号、尾數、基數和指數這四部分來表示的小數。

浮點數

根據浮點數的組成,因為是在計算機中表示浮點數,基數自然是2(不存儲),因此IEEE754浮點數隻關注符号、尾數和指數三部分。

浮點數在計算機中的存儲方式遵循IEEE754浮點數計數标準,可以表示為:

浮點數

類似于數學課本上所學的科學計數法表示方式:有效數字 指數位。

因此,隻要給出:符号(S)、階碼部分(E)、尾數部分(M)這三個信息,一個浮點數的表示就确定下來了。一般IEEE754浮點數有兩種類型,單精度浮點數(float)和雙精度浮點數(double),還有其他的,不常用。單精度浮點數使用4字節表示,雙精度浮點數使用8字節表示。所以float和double這兩種類型的浮點數在計算機中的存儲結構如下圖:

單精度浮點數

雙精度浮點數

符号位:0表示正數,1表示負數。

階碼部分(指數部分):對于float型浮點數,指數部分8位,我們知道,在十進制的科學計數法中,指數可以是負數,而計算機存儲浮點數的“指數部分”又是一個無符号的整數,因此,IEEE754标準規定,指數必須減去一個偏移值而得到真實的“指數值”。

偏移值的計算公式:2^(e-1) -1, e為階碼(指數)的位數,即為8,因此偏移值是2^(8-1) -1=127。

IEEE754規定,2^(e-1) -1的值是 0,小于這個值表示負數,大于這個值表示正數。因此,對于單精度浮點數而言, 2⁸⁻¹-1= 127 是 0;雙精度浮點數,2¹¹⁻¹-1 = 1023 是 0。

沒看懂?舉個栗子。

比如十進制數 0.15625,轉為二進制是 0.00101。為了讓第 1 位為 1,執行邏輯右移 3 位,尾數部分成為 1.01,因為右移了 3 位,所以指數部分是 -3。

根據 IEEE754 的定義,單精度浮點數情況下,-3 的實際值是 127 - 3 = 124。明白了嗎?127 表示 0,124 就表示 -3 了。

如果你還不理解,想想這個問題。

如果讓你用撲克牌(A ~ K,也就是 1 ~ 13)來表示支持負數的。怎麼辦?我們會選擇一個中間的數,比如 7 當做 0,因此 10 就是 3,4 就是 -3。現在理解了吧!

那為什麼單精度浮點數指數偏移值是127呢?

由于篇幅有限,這個留給大家自行查找資料。

尾數部分:浮點數的名稱由來在于小數點的位置是浮動的,比如 7.5x10、0.75 x10² 等表示法,值一樣,但小數點位置不一樣。在具體存儲時,需要固定一種形式,這叫做尾數的标準化。

IEEE754 規定,在二進制數中,通過移位,将小數點前面的值固定為 1。IEEE754 稱這種形式的浮點數為規範化浮點數。

因為IEEE754規定第 1 位永遠為 1,因此可以省略不存。

對于float型浮點數,尾數部分23位,換算成十進制就是2^23=8388608,所以十進制精度最多7位。

4、實例講解

講解之前先熟悉一下進制轉換:

二進制轉十進制

和整數轉換一樣,采用各位數值和位權相乘。比如:

(0.101)₂ = 1×2⁻¹ 0×2⁻² 1×2⁻³ = (0.625)₁₀

記住小數點後第一位是從 -1 開始即可。

十進制轉二進制

十進制整數轉二進制采用“除 2 取餘,逆序排列”法。例如十進制數 11 轉為二進制:

11/2=5 … 餘1

5/2=2 … 餘1

2/2=1 … 餘0

1/2=0 … 餘1 (1除以2不夠除,也就是商為0,餘數為1-0=1)

所以 (11)₁₀ 的二進制是 (1011)₂

但如果十進制是小數,轉為二進制小數如何做?

采用“乘 2 取整,順序排列”。讓小數一直乘2,小于1則用結果繼續乘,大于1則用結果減1繼續乘,等于1則結束。

例如十進制小數 0.625 轉為二進制小數:

0.625*2=1.25 … 取整數部分1

0.25*2=0.5 … 取整數部分0

0.5*2=1 … 取整數部分1

順序排列,所以 (0.625)₁₀ = (0.101)₂

如果一直不能等于1怎麼辦,會有什麼影響?

暫且擱置不講。

開始講解實例:例如 178.125

1、分别把浮點數的整數部分和小數部分轉換成2進制。

整數部分:

178/2=89 … 餘0

89/2=44 … 餘1

44/2=22 … 餘0

22/2=11 … 餘0

11/2=5 … 餘1

5/2=2 … 餘1

2/2=1 … 餘0

1/2=0 … 餘1

逆序排列,所以 (178)₁₀ 的二進制是 (10110010)₂

小數部分:

0.125*2=0.25 … 取整數部分0

0.25*2=0.5 … 取整數部分0

0.5*2=1 … 取整數部分1

順序排列,所以 (0.125)₁₀ = (0.001)₂

合起來即是:10110010.001

2、轉換成計算機存儲形式的二進制浮點數

把小數點移動到整數位隻有1,即為:1.0110010001*2^111,111是二進制,換算成十進制為7,由于左移了7位,所以是111。

3、階碼(指數)

階碼(指數)的計算公式:階數(指數) 偏移量(單精度浮點數指數偏移值是127)

即:111 01111111=10000110 (7 127=134)

4、尾數

小數點後面的數,即0110010001

小數點前面的1去哪裡了?由于尾數部分是規格化表示的,最高位總是1,所以省略不存。這樣尾數部分多了 1 位,提高了精度。

5、符号位

由于浮點數是正數,故為0(負數為1)

6、結果

最終結果為:

(178.125)₁₀ = (01000011001100100010000000000000)₂

單精度浮點數為32位,不夠32位後面補0。

0為什麼補在後面?

因為是尾數部分,補在後面比補在前面對實際數值影響比較小。

(178.125)₁₀ = (01000011001100100010000000000000)₂

2進制轉換16進制如下:

0100 4

0011 3

0011 3

0010 2

0010 2

0000 0

0000 0

0000 0

16進制為43322000

參考了網絡上有關浮點數轉換的文章,加上個人的理解,整理成文!

如有侵權,請告知!謝謝!

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved