IEEE754浮點數 向偶數捨入

2021-10-04 07:46:24 字數 3475 閱讀 2275

我們大家都知道,浮點數的標準是ieee754。關於ieee754格式這裡不講了,主要是要講一下它的預設捨入方式。

因為表示方法限制了浮點數的範圍和精度,所以使用浮點數只能近似地表示實數運算。而此時就不得不考慮捨入的問題了。捨入的原則是找到最接近的匹配值。

為此,ieee754定義了四種不同的捨入方式:

下表是按照四種不同的方式保留整數後的捨入結果:

所謂向偶數捨入(round-to-even),其真實的意思是向最接近的值捨入(round-to-nearest)。用通俗的話講就是四捨六入五成雙,或者四捨六入五湊偶。當然這句通俗的口訣是針對十進位制來說的。

向偶數捨入只有兩條規則:

如果最接近的值唯一,則直接向最接近的值捨入;

如果是處在「中間值」,那麼要看保留位(guard bit)是否是偶數,如果是偶數則直接捨去後面的數不進製,如果是奇數則進製後再捨去後面的數。

只要理解了上面兩條規則,那麼就完全掌握了向偶數捨入。為了詳細解讀這兩條規則,下面將分別用十進位制和二進位制來舉例說明。

我們以十進位制數來舉例。如果我們想保留兩位小數,即留下十分位和百分位上的數。那麼保留位(guard bit)就是結果的最低位,即百分位;近似位(round bit)就是第乙個被捨掉的位,即千分位;而千分位之後的所有位(包括萬分位、十萬分位等等)或起來構成粘滯位(sticky bit)。

同理,對於二進位制,如果我們想要保留兩位小數,那麼小數點右邊第二位就是保留位(guard bit),小數點右邊第三位就是近似位(round bit),小數點右邊第四位開始一直向右的所有小數字或起來構成粘滯位(sticky bit)。

用cmu的課件也許更容易理解一點。

在進行舉例說明之前,我們有必要引入乙個中間值的概念。這對於理解 「向偶數捨入」 至關重要。對於十進位制來說,如果要保留一位小數,即百分位和百分位之後的小數都會被近似掉,那麼此時中間值就是***.x5000…(5之後全零)。

也就是說,求中間值的方法如下:

保留位(guard bit)和左邊的數字保持不變;

近似位(round bit)改寫為n/2(n為進製數,十進位制就是10,二進位制就是2)

粘滯位(sticky bit)全部寫零

原始值(十進位制)

中間值 (保留一位小數)

中間值 (保留兩位小數)

1.334

1.350

1.335

1.622

1.650

1.625

1.744

1.750

1.745

1.835

1.850

1.835

1.668

1.650

1.665

1.774

1.750

1.775

1.488

1.450

1.485

原始值(二進位制)

中間值 (保留一位小數)

中間值 (保留兩位小數)

1.101

1.110

1.101

101.111

101.110

101.111

11.001

11.010

11.001

1.010

1.010

1.011

1.100

1.110

1.101

對於以下十進位制的數值,我們採用向偶數捨入的方式,保留精確度到十分位,即保留一位小數。

請看第一組例子:

原始值中間值

近似值 (向偶數捨入)

1.36

1.35

1.41.751

1.75

1.81.852

1.85

1.91.77

1.75

1.81.45001

1.45

1.5可以看到,上述這些原始值都比中間值要大,也就是「四捨六入五成雙」中的「六入」。所以都向十分位進一,從而使得損失的精度最小。

請看第二組例子:

原始值中間值

近似值 (向偶數捨入)

1.33

1.35

1.31.74

1.75

1.71.82

1.85

1.81.71

1.75

1.71.43

1.45

1.4可以看到,上述這些原始值都比中間值要小,也就是「四捨六入五成雙」中的「四捨」。所以直接捨棄,不進製,從而使得損失的精度最小。

請看第三組例子:

原始值中間值

近似值 (向偶數捨入)

1.35

1.35

1.41.75

1.75

1.81.85

1.85

1.81.25

1.25

1.21.45

1.45

1.4可以看到,上述這些原始值和中間值相等,也就是「四捨六入五成雙」中的「五成雙」。對於這些和中間值完全相等的原始值,我們考察保留位(guard bit),如果保留位是偶數,則直接捨棄近似位(round bit)和粘滯位(sticky bit);如果保留位是奇數,則先向保留位進一,之後捨棄近似位(round bit)和粘滯位(sticky bit)。這樣,結果中的保留位就是偶數了。這就是向偶數捨入 名字的由來。

對於以下二進位制的數值,我們採用向偶數捨入的方式,保留一位小數。

請看第一組例子:

原始值(二進位制)

中間值近似值 (向偶數捨入)

1.111

1.11

10.0

1.0101

1.01

1.11.0111

1.01

1.1可以看到,上述這些原始值都比中間值要大,也就是「四捨六入五成雙」中的「六入」。所以都向小數點右邊第1位進一,從而使得損失的精度最小。

請看第二組例子:

原始值(二進位制)

中間值近似值 (向偶數捨入)

1.001

1.01

1.01.10

1.11

1.1可以看到,上述這些原始值都比中間值要小,也就是「四捨六入五成雙」中的「四捨」。所以直接捨棄,不進製,從而使得損失的精度最小。

請看第三組例子:

原始值(二進位制)

中間值近似值 (向偶數捨入)

1.110

1.11

10.0

1.010

1.01

1.0可以看到,上述這些原始值和中間值相等,也就是「四捨六入五成雙」中的「五成雙」。對於這些和中間值完全相等的原始值,我們考察保留位(guard bit),如果保留位是偶數,則直接捨棄近似位(round bit)和粘滯位(sticky bit);如果保留位是奇數,則先向保留位進一,之後捨棄近似位(round bit)和粘滯位(sticky bit)。這樣,結果中的保留位就是偶數了。這就是向偶數捨入 名字的由來。

怎麼樣?現在徹底搞懂什麼是向偶數捨入了吧。

單精度浮點數(IEEE754)

單精度浮點數佔據4個位元組,4個位元組的分配如下 a 第一位為符號位,0表示正,1表示負 b 第2 9位為階碼,採用移碼表示 c 第10 32位為尾數,採用原碼表示。1 給定32位串,如何轉換成十進位制數 假設記憶體中存在32位串 cd cc 08 41。因為intel cpu採用little en...

IEEE754浮點數精度轉換

最近在利用串列埠讀取溫度採集模組上面的資料時發現返回過來的資料是16進製制的ieee754型別,很顯然這不是我們想要看到的,因此我們必須對他進行解析 因為我用的是j a,所以首先翻了相關文件,發現還真提供的有 float.intbitstofloat hex 當然自己也可以手寫乙個,這時我們就需要了...

IEEE 754 浮點數的四種捨入方式

四種捨入方向 向最接近的可表示的值 當有兩個最接近的可表示的值時首選 偶數 值 向負無窮大 向下 向正無窮大 向上 以及向0 截斷 說明 預設模式是最近捨入 round to nearest 它與四捨五入只有一點不同,對.5的捨入上,採用取偶數的方式。舉例比較如下 例2 最近捨入模式 round 0...