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