新四季網

c語言浮點數怎麼判斷是否等於0(深入理解浮點數表示)

2023-04-24 02:51:42 3

浮點表示對形如的有理數進行編碼。

直到 20 世紀 80 年代,每個計算機製造商都設計了自己的表示浮點數的規則,以及對浮點數執行運算的細節。另外,它們常常不會太多地關注運算的精確性,而把實現的速度和簡便性看得比數字精確性更重要。

大約在1985 年,這些情況隨著IEEE 標準754 的推出而改變了,這是一個仔細制訂的表示浮點數及其運算的標準。這項工作是從1976 年開始由Intel 贊助的,與8087 的設計同時進行,8087 是一種為8086 處理器提供浮點支持的晶片。他們請William Kahan(加州大學伯克利分校的一位教授)作為顧問,幫助設計未來處理器浮點標準。他們支持Kahan加人一個IEEE 資助的制訂工業標準的委員會。這個委員會最終採納的標準非常接近於Kahan 為Intel 設計的標準。目前,實際上所有的計算機都支持這個後來被稱為IEEE 浮點的標準。這大大提高了科學應用程式在不同機器上的可移植性。

IEEE浮點標準用的形式來表示一個數:

① 符號(sign),s決定這個數是負數(s=l)還是正數(s=0),而對於數值0的符號位解釋,作為特殊情況處理。

② 尾數(significand),M是一個二進位小數,它的範圍是1~2-,或者是0~1-。

③ 階碼(exponent),E的作用是對浮點數加權,這個權重是2的E次冪(可能是負數)。

E在後面所述的規格化和非規格化表示時有所區別。

將浮點數的位表示劃分為三個欄位,分別對這些值進行編碼:

(1) 一個單獨的符號位s,直接編碼符號s。

(2) k位的階碼欄位,編碼階碼E。

(3) n位小數欄位,編碼尾數M,但是編碼出來的值也依賴於階碼欄位的值是否等於0。

在單精度浮點格式(C 語言中的float)中,s、 exp 和 frac 欄位分別為 1 位、k=8 位和 n=23 位,得到一個 32 位的表示。

在雙精度浮點格式(C 語言中的double)中,s、exp 和 frac 欄位分別為 1 位、k=11 位和 n=52 位,得到一個64 位的表示。

1 規格化與非規格化浮點數以及特殊值

階碼的值決定了這個數是規格化的、非規格化的或特殊值:

規格化的值的階碼欄位被解釋為以偏置(biased)形式表示的有符號整數。也就是說,階碼的值是E=e-Bias,其中e 是無符號數,是一個等於(單精度是127,雙精度是1023)的偏置值。由此產生指數的取值範圍,對於單精度是-126~ 127, 而對於雙精度是-1022~ 1023。尾數定義為M=1 f。

當階碼域為全0時,所表示的數是非規格化形式。在這種情況下,階碼值是E=1-Bias,而尾數的值是M=f,也就是小數欄位的值,不包含隱含的開頭的1。

使階碼值為1- Bias 而不是簡單的-bias 似乎是違反直覺的。這種方式提供了一種從非規格化值平滑轉換到規格化值的方法。

6 位浮點格式可表示的值(k=3的階碼位和 n=2的尾數位。偏置量是 3:

2 浮點數與其它類型轉換時的溢出與捨入

需要注意的是,浮點數加法和乘法不滿足結合律 ,也不滿足乘法對加法的分配律,以下舉例說明:

(3.14 1e10)-1e10 = 0, // 3.14因為精度被略掉了

3.14 (1e10-1e10) = 3.14,

(1e20 *1e20) * 1e-20= inf,

1e20 * (1e20 * 1e-20)= 1e20

1e20 * (1e20 - 1e20)= 0.0,

1e20 * 1e20 - 1e20 * 1e20 = NaN

這些特殊的數學性質對於科學計算程式設計師和編譯器的優化限制都具有重要意義,舉例如下:

x = a b c;y = b c d;// 編譯器可能試圖通過產生下列代碼來省去一個浮點加法t = b c;x = a t;y = t d;// 但是對x來說,這個計算可能會產生於原始值不同的值,因為它使用了加法運算的不同結合方式

3 浮點數的加減運算步驟

浮點數的加減運算分為五步:

如有

X = 0.1011×2^3

Y = 0.1001×2^4

3.1 對階

對階是指對齊小數位,遵循「小階向大階看齊」的原則,以便結果的精度更高。

對階還是比較好理解的。把指數小的數(X)的指數(3)轉化成和指數高的數(Y)的指數(4)相等,同時指數小的數(X)的尾數的符號位後邊補兩個數指數之差的絕對值個(1個)0。對於本例來說,就是把X變為:

X = 0.01011 ×2^4

3.2 尾數相加減按照例子來說,尾數相加減:00 . 0 1 0 1 1 0 . 1 0 0 1 (注意看是怎麼對齊的)等於00 . 1 1 1 0 1這是相加,相減是把減數換成對應的補碼再做相加運算即可。

3.3 規格化不滿足規格化的尾數進行規格化處理。當尾數發生溢出可能(尾數絕對值大於1)時,應調整階碼。當出現以下兩種情況時需要進行規格化。

① 兩個符號位不相同,右規:兩個符號位不同,說明運算結果溢出。此時要進行右規,即把運算結果的尾數右移一位。需要右規的只有如下兩種情況:01××××10××××01×××右移一位的結果為001×××10××××右移一位的結果為110×××。最後將階碼(指數) 1。

② 兩個符號位相同,但是最高數值位與符號位相同,左規:兩個符號位相同,說明沒有溢出。此時要把尾數連續左移,直到最高數值位與符號位的數值不同為止。需要左規的有如下兩種情況:111×××000×××111×××左移一位的結果為11×××0000×××左移一位的結果為00×××0。最後將階碼(指數)減去移動的次數。

3.4 捨入執行右規或者對階時,有可能會在尾數低位上增加一些值,最後需要把它們移掉。比如說,原來參與運算的兩個數(加數和被加數)算上符號位一共有6個數,通過上邊三個操作後運算結果變成了8個數,這時需要把第7和8位的數去掉。如果直接去掉,會使精度受影響,通常有下邊兩個方法:

① 0舍1入法:假設運算結果:X = 0.11010111,假設原本加數和被加數算上符號位一共有6個數,結果X是10個數,那麼要去掉後四個數(0111)。由於0111首位是0(即要去掉的數最高位為0),這種情況下,直接去掉這四個數就可以。該例最後結果為 X = 00.1101假設運算結果 Y = 00.11001001,這時要去掉的數為1001四個數,由於這四個數的首位為1(即要去掉的數最高位為1),這種情況下,直接去掉這四個數,再在去掉這四個數的新尾數的末尾加1。如果 1後又出現了溢出,繼續進行右規操作。該例最後結果為 Y = 00.1101。② 置1法這個比較簡單,去掉多餘的尾數,然後保證去掉這四個數的新尾數的最後一位為1(即是1不用管,是0改成1)即可。比如 Z=00.11000111,置1法之後的結果為Z=00.11001。

3.5 階碼溢出處理階碼溢出在規格化和右移的過程中都有可能發生,若階碼不溢出,加減運算正常結束(即判斷浮點數是否溢出,不需要判斷尾數是否溢出,直接判斷階碼是否溢出即可)。若階碼下溢,置運算結果為機器0(通常階碼和尾數全置0)。若上溢,置溢出標誌為1。

4 浮點數轉換時的捨入

// 有問題的版本 #include int main { float sum = 0.0f; // sum是浮點數 for (int i = 0; i < 10000; i ) sum = i 1; // 整數i 1會轉換為浮點表示,當達到16777215後,浮點表示會有精度丟失 // 1累加到5793會超過16777215 printf("Sum: %f\n", sum); // 50002896.000000 return 0;}// 1 2 3 … 10000 = 10000 * (10000 1) / 2 = 50005000 ?// 修正的版本#include int main { float sum = 0.0f, corr = 0.0f; /* corrective value for rounding error */ for (int i = 0; i < 10000; i ) { float y = (i 1) - corr; /* add the correction to specific item */ float t = sum y; /* bits might be lost */ corr = (t - sum) - y; /* recover lost bits */ sum = t; } printf("Sum: %f\n", sum); return 0;}

16777215的浮點表示:

https://www.ixigua.com/7031572604158738981

https://www.ixigua.com/7021185140311196196

https://www.toutiao.com/i7038433663641551397/

-End-

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了