# Floating Point ## 浮點數表示法 符號位(Sign Bit): 1位,表示正數或負數。 指數部分(Exponent): 用來表示數字的次方,通常使用偏置表示法。 有效數部分(Significand 或 Fraction): 用二進制表示小數部分,類似科學記號的尾數。 ## 特殊數字 ![image](https://hackmd.io/_uploads/rkSJQZYqT.png) ### 正零和負零: 在浮點數中都有表示,這是為了區別一些極小數字的正負方向。 為了解決浮點數無法準確表示0的問題,引入了正零和負零的概念。 在浮點數的設計中,signed bit(符號位)可以是0或1,但是當指數(exponent)和有效數(fraction)全為0時,這時我們區分正零和負零。 舉例來說,如果一個數字非常接近於0但是是正的,我們可以用正零表示; 反之,如果它是接近於0但是是負的,我們可以用負零表示。這樣的設計有助於在處理 ## Gradual Underflow #### underflow 在浮點數表示法中指的是嘗試表示一個比能夠合法表示的最小正規數還小的數字。當數字太小,無法用正規化形式表示時,系統會使用非規格化數(denormalized numbers)的方式來處理。 #### denormalized number 在浮點數表示法中,正規數通常以科學計數法的形式表示,即 1.xxxx * 2^y 的形式。 而非規格化數則是省略了 1.xxxx 中的 1,這樣有效數部分的最高位為零。此時,指數部分為最小值,表示這是一個非規格化的浮點數。 ### Infinity 在浮點數表示法中,將一個數字除以零的操作應該產生正負無窮,而不是發生溢出。這是為了在進行進一步計算時保持有效性,例如,進行 X/0>Y 的比較可能是一個有效的操作。 IEEE 754標準中為正負無窮提供了特殊的表示法: * 最大的正規化指數被保留用於表示正無窮,而最小的正規化指數則被保留用於表示負無窮。 * 對於正無窮,符號位為0,指數部分全為1,有效數部分全為0。 * 對於負無窮,符號位為1,指數部分全為1,有效數部分全為0。 這樣的表示法使得正負無窮能夠在浮點數中被準確表示。 當進行除以零的操作時,結果會被標準化為正負無窮,而不是導致溢出。這種處理方式有助於在數學和科學計算中進行更合理的操作,同時避免了數學上不合法的行為。 ### NaN(非數字): NaN(Not a Number)是浮點運算中的一種特殊表示法,用於指示未定義或無法表示的數值。進行導致未定義或不確定結果的操作,例如計算負數的平方根或除以零,會產生NaN。 IEEE 754標準中的NaN表示: * 指數部分:所有位元設為1(在單精度中為255)。 * 有效數部分:顯著位元中的非零位元。 NaN在浮點運算中有幾個用途: * 錯誤指示: NaN充當錯誤或未定義結果的一種信號機制。當計算遇到未定義或問題情況時,結果被設置為NaN,向程序員發出錯誤的信號。 * 調試: NaN可以幫助調試,因為它會污染參與的任何操作。任何涉及NaN的操作,即使具有有效的運算元,結果也將為NaN。這種污染允許程序員追蹤意外NaN值的來源。 * 傳播: NaN會通過計算進行傳播。如果計算中的任何運算元為NaN,結果將為NaN。這種行為防止未定義或意外的結果傳播到後續計算中。 ## 浮點數運算: 浮點數相加: 將兩個浮點數的指數調整為相同,然後將有效數相加。結果需要檢查是否overflow或underflow。 浮點數相乘: 將有效數相乘,指數相加。同樣,需要處理overflow和underflow的情況。 ## Bias 浮點數指數使用偏置表示法,例如,單精度浮點數的偏置是127。指數需要減去這個偏置值,以得到實際的指數。