C標準庫 浮點數

2022-03-11 11:36:31 字數 2130 閱讀 7114

浮點數格式學c

的時候就知道,浮點數採用的是類似於科學計數法的表示方式。具體的浮點數的模型是:

乙個尾數(

mantissa

),乙個基數(

base

),乙個指數(

exponent

)和符號位表示。

float

和double

的表示格式列個**:

型別儲存位數

偏移值符號位(s)

指數字(e)

尾數字(m)

總位數十六進製制

十進位制單精度 float 1

位 8位

23位

32位0x7fh

+127

雙精度 double 1

位 11 位

52位64位

0x3ffh

+1023

不過有些細節是不得不說的:

基數————

這個基數是可以使用者定義的,一般是

2,但取10,

16也是可以的。如何指定呢?

在標頭檔案

float.h

中定義了巨集

flt—radix

,它的值就是選定的基數。

尾數———— 這是個定點小數,採用原碼儲存。尾數的最左端隱含了

1,也就是說

23位全部用來表示小數,而實際表示的數是

24位精度。

指數————

這當然是整數,不過採用移碼儲存。

為了處理負指數的情況,要把實際指數值加上乙個偏移值作為儲存值(

float

為127;double

為1023

)。對單精度浮點而言,有效的指數範圍是

-126~127

(儲存值為

1~254

,這是因為兩個端點值用作特殊值表示)。

ieee

754

定義了什麼

只要一說到浮點數,這個標準是不能不提的。那麼這個標準主要規定了哪些東西呢?a、

浮點數的格式:

除了上面提到的兩種基本的浮點格式,還定義了這兩種格式的擴充套件。

但標準只規定擴充套件格式的最小精度和大小。例如,

ieee

雙精度擴充套件格式必須至少具有64

位有效數字,並總共占用至少

79位。b、

4

種浮點數捨入方式:

這些捨入方式是可以由

float.h

中的巨集flt—rounds

指定的。c、

5

種浮點異常

如果產生異常,就會影響異常向量表,有些還會產生中斷。至於中斷,異常處理當然不是本文要討論的。

d、特殊值:

(還記得指數部分沒有用到的兩個端點值麼?)

這個標準規範的東西當然不止這些,還有一些關於運算準確度要求、不同型別資料間轉換及不同進製資料間的轉換等等。

其實這裡談到的是浮點數最老的標準,新標準應該也有幾個了吧,最好的資料當然就是這些標準的文件,倘若有時間,仔細看看還是有好處的。

庫檔案float.h

最初很多處理器在硬體方面並不支援浮點運算,因為這會增加不少成本,不支援浮點運算,會使微處理器設計的複雜度減半。之所以需要浮點運算,是因為科學計算等一些高精度運算的需要的存在。float.h

這個檔案的構造當然是要遵循這個標準的,不過這個標頭檔案並有太多的東西。除了前面提到過的兩個巨集,這個標頭檔案還定義了一些關於浮點數取值範圍的巨集。

其實也沒有特別的理由要來認識這個庫,畢竟即使是做數值計算的演算法,也可以用

matlab

這個彪悍的工具。不過,在了解了這個標頭檔案後,約定整數範圍的

limits.h

就很容易看清楚了。不過這也僅限於認識這個庫,至於它要怎麼實現就又是另乙個層次的問題了。

參考文章:定點數與浮點數的區別。(文章不錯,雖然有些小錯誤)

IEEE 浮點數標準

現在計算機中,浮點數一般採用 ieee 制定的國際標準,這種標準形式如下 數符s 階碼 含階符 尾數 小數點位置 按 ieee 標準,常用的浮點數有三種 符號位s 階碼 尾數 總位數 短實數 單精度 1 8 23 32 長實數 雙精度 1 11 52 64 臨時實數 擴充套件精度 1 15 64 8...

C 浮點數詳解

ieee 754規定任意乙個二進位制浮點數v可以表示成下面的形式 v 1 s m 2 ev 1 s m 2 e v 1 s m 2e例如下圖是32位單精度浮點數儲存模型 其中s表示符號位,當s 0,v為正數 當s 1,v為負數。m表示有效數字,1 m 2 規約形式 e表示指數字。eg 十進位制的6....

浮點數及其國際標準

浮點數 float 又稱作浮點數,是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體來說,這個實數由乙個整數或定點數 即尾數 乘以某個基數 計算機中通常是2 的整數次冪得到,這種表示方法類似於基數為10的科學記數法。浮點計算是指浮點數參與的運算,這種運算通常伴隨著因為無...