深入淺出浮點數

1.浮點數描述

 

浮點數,通俗的講就是顯示格式具有小數點的數,如1.234、1234.0(十進制形式)。計算機中浮點數會按照某一處理標準存儲在單元中(如IEEE 754標準),其複雜度遠大於其它類型的數據。

 

通常對於要麼很大或很小的浮點數,難以用十進制形式方便地編寫,則使用科學記數法來表示:即由一個有效數字(尾數mantissa)和冪數(exponent)組合而成,通常是乘以基數爲10的整數次指數得到。

 

 

其中尾數應滿足1≤|mantissa|≤10(通過調整10的指數大小使得mantissa的絕對值至少爲1但小於10)。如STEP 7-MicroWIN SMART中浮點數0.00001234顯示爲1.234E-05:

 

 

如一個電子的質量大約是0.000 000 000 000 000 000 000 000 000 000 910 938 356  kg。如果用一般的方法,將所有位數都寫出來,很難直接確知它的大小,還會浪費很多空間。但使用科學記數法,寫爲9.109 383 56 × 10-31  kg,相對要簡單得多,數的數量級、精確度和數值都一目瞭然。

 

有效數字:指科學計算中用以表示一個浮點數精度的那些數字。一般地,指一個用小數形式表示的浮點數中,從第一個非零的數字算起的所有數字。如1.24和0.00124的有效數字都有3位。包含小數點的數中,結尾的零是有效的。例如 12.2300 有六位有效數字(1、2、2、3、0、0)。

 

2.IEEE二進制浮點數算術標準(IEEE 754)

 

該標準定義了五種基本格式,有三種二進制浮點基本格式(用32,64或128位編碼)和兩種十進制浮點基本格式(用64或128位編碼)。如PLC中常使用的單精度二進制浮點格式:binary32,雙精度二進制浮點格式:binary64。

 

一個浮點數 (Value) 可以這樣表示:

 

 

也就是浮點數的實際值,等於符號位(sign bit)乘以指數偏移值(exponent bias)再乘以有效數(significand)。

 

 

二進制浮點數是以符號數值表示法的格式存儲:最高有效位被指定爲符號位(sign bit);“指數部分”即次高有效的e個比特存儲指數部分;最後剩下的f個低有效位的比特,存儲“有效數”(significand)的小數部分(fraction)。

 

單精度浮點格式

 

在IEEE 754中定義單精度浮點數格式是一種:在計算機存儲器中佔用4個字節(32 bits),利用“浮點”(浮動小數點)的方法,表示一個範圍很大的數值,稱爲binary32格式。

 

0.15625二進制存儲值

 

標準規定binary32具有:

  • 符號位:1位(0代表正,1代表負)

  • 指數存儲寬度:8位

  • 有效數存儲寬度:23位(真有效數包括二進制點右側的23個分數位(及真有效數的小數部分)和值爲1的隱式前導位(位於二進制點的左側,及真有效數的整數部分)。因此,只有23 個小數位的有效位被存儲,但總精度是24位)

 

 

單精度浮點數的指數域是8位,存儲值爲0~255。標準規定固定偏移值是28-1-1=128-1=127,則單精度浮點數的指數部分實際取值是從0-127=-127到255-127=128(-127和128被用作特殊值處理,包括“非規約形式的浮點數”和“特殊值”)。

採用指數的實際值加上固定的偏移值的辦法(指數偏移)表示浮點數的指數,好處是可以用長度爲e個比特的無符號整數來表示所有的指數取值,這使得兩個浮點數的指數大小的比較更爲容易,因爲非負數的比較完全可以從最高有效位遍歷比較。

 

以上面的0.15625二進制存儲值爲例轉爲浮點數(Value):

 

 

規約形式的浮點數

 

 

如果浮點數中指數部分的編碼值在0<exponent≤2e-2之間(單精度浮點數e=8),那麼這個浮點數稱爲規約形式的浮點數(Normalized finite numbers)。

 

最小正規約浮點數:

0 00000001 000000000000000000000002 = 0080 000016 = 2 -126≈1.1754943508×10 -38 

最大正規約浮點數:

0 11111110 111111111111111111111112 = 7f7f ffff16 = 2 127 ×(2 - 2 -23)≈3.4028234664×10 38

 

非規約形式的浮點數

 

如果浮點數的指數部分的編碼值是0(因爲非規格數的指數是固定的exponent = 2-126,於是也就不用存儲指數,因此編碼值全爲0,這也方便和規約形式的浮點數分開),分數部分非零,那麼這個浮點數將被稱爲非規約形式的浮點數(Denormalized finite numbers)。

 

 

一般是某個數字非常接近零時纔會使用非規約型式來表示。其絕對值已經小於所有的規約浮點數的絕對值,即所有的非規約浮點數比規約浮點數更接近0,即上圖GAP範圍內的數。對於規約浮點數,其有效數(significand=1+fraction)大於等於1且小於2(因爲隱式前導位爲1),而非規約浮點數的有效數(significand=fraction)小於1且大於0(因爲隱式前導位爲0)。

 

如STEP 7-MicroWIN SMART,從手冊中給出的數值範圍可知,S7-200 SMART PLC無法處理非規約形式的浮點數

 

 

值2#0000_0000_0011_0000_0000_0000_0000_0000,對應非規約形式的浮點數爲4.408104E-039,其顯示爲NAN(作爲溢出處理)。

 

 

對於WINCC,可以處理非規約形式的浮點數,這一點要了解。

 

 

 

特殊值

除了規約和非規約數,還包括一些特殊值:

  • 如果指數 = 0並且尾數的小數部分是0,這個數爲±0(和符號位相關)

  • 如果指數 = 2e-1並且尾數的小數部分是0,這個數是±∞(同樣和符號位相關),如STEP 7-MicroWIN SMART中顯示爲±INF。

  • 如果指數 = 2e-1並且尾數的小數部分非0,這個數表示爲一個非法數(NaN)。

 

精度

任何數據的存儲長度是有限的,單精和雙精浮點數的有效數字分別是有存儲的23和52個位,加上最左邊沒有存儲的1個隱式前導位,即是24和53個位。

 

由以上計算得出,單精和雙精浮點數可以保證7位和15位十進制有效數字。對於超出可表示精度的將舍入。

舍入

任何有效數上的運算結果,通常都存放在較長的寄存器中,當結果被放回浮點格式時,必須將多出來的比特丟棄。 有多種方法可以用來運行舍入作業,實際上IEEE標準列出4種不同的方法:

  • 舍入到最接近:舍入到最接近,在一樣接近的情況下偶數優先(Ties To Even,這是默認的舍入方式):會將結果舍入爲最接近且可以表示的值,但是當存在兩個數一樣接近的時候,則取其中的偶數(在二進制中是以0結尾的)。

  • 朝+∞方向舍入:會將結果朝正無限大的方向舍入。

  • 朝-∞方向舍入:會將結果朝負無限大的方向舍入。

  • 朝0方向舍入:會將結果朝0的方向舍入。

  •  

  • 更多精彩內容,可關注本人微信公衆號scadaclub

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章