浮點數的加減計算總結

2021-07-22 23:59:25 字數 2280 閱讀 9872

–本篇後面計算部分待糾正。因為右移時是否採用捨入的策略,需要仔細考量。不特別提出,是不是右移時簡單的截斷即可?

update : 研究了其他習題的做法,不強調右移時如何捨入時,直接丟掉,算術右移,丟失精度。在補碼移位中,有左零右一的說法,即左移:低位補0,右移:高位補1.

首先要說的是:浮點運算中的下溢指的是:運算結果的絕對值小於機器數所能表示的最小絕對值。

再看告知浮點數的格式,最大值問題:

設浮點數共12位,其中階碼含1位階符共4位,以2為底,補碼表示。尾數含一位數符共8位,補碼表示,規格化。該浮點數所能表示的最大正數是?

解答:首先,我們馬上可以構想出補碼最大時的樣子,因為和原碼一樣,是0.1111111…1形式。

這裡呢,尾數含數符共8位,所以是0.1111111(7個1) , 我做的時候沒有計算,直接認為是2−

2(−7

)實際上稍微算一下: 2−

1+2−

2+…+

2−7=

2−1⋅

(2−7

−1)/

(2−1

−1)=

1−2−

7.所以,很容易就得到了最大的尾數是什麼。

再看階符,含符號位共4位,補碼形式的階碼,那麼最大自然就是27

.所以最大的浮點數就是27

∗(1−

2−7)

=27−

1.

再看兩個浮點數相加減的規格化問題:x=

−0.875∗2

1,y=

0.625∗2

2 , 設浮點數的格式是階符1位,階碼兩位,數符1位,尾數3位,通過補碼求出z = x- y的二進位制浮點數規格化結果是: 0111011.

解答:本題可以牽涉到前面的很多小的有趣的知識點。

首先,小數化二進位制。 x=

−0.875

=1.111 y

=0.625

=0.101

我們先假設用原碼搞定計算,再化為補碼。那麼x

=−0.875∗2

1=1.011∗2

2 // 因為尾數只有三位,所以右移時去了一位。

於是問題變成:

1.011∗2

2−0.101∗2

2 但是用原碼計算,不能直接帶入符號考慮,而是看1.011是負數,減去乙個正數等同於兩個負數相加。

因此最終結果是負數,因此把絕度值相加即可:

0.011

+0.101

=1.000

右移一位,結果變成:

1.100∗2

3==>

011,

1100

結論是:結果不同於用補碼計算的。

補碼計算的過程: x=

−0.875∗2

1=1.001∗2

1==>

1.100∗2

2 // 右移,並不是1.101,因為沒有說用0舍1入法捨入

0.625∗2

2=0.101∗2

2 對好階,看尾數的加減法:

1.100補−

0.101補=

1.100補+

(−0.101)補

=1.100補+

1.011補=

10.111

右移一位:

1.1011∗2

// 也是直接捨去,沒有考慮使用捨入時是否加1的策略

從而結果是:

1.100∗2

3==>

011,

1011

這裡進一步分析:用補碼得到的結果是:-5

原碼得到的是:-4

而真正的結果是:-4.25

所以,可以思考,在哪一步導致了原碼的精度大於補碼了?

1.100表示的數是:-0.5

1.1001表示的數是:-0.4375

本身差別不大,但是一放大8倍就不一樣了:-4, -3.5.

或者在捨入的時候看問題,本例用的是直接捨去法,實際上有兩種策略:0舍1入和恆置1法。所以末尾捨去的是1時,需要加1.

因此,當求得尾數是

10.111

時,右移變

1.011

+0.001

=1.100

從而結果是:

1.100⋅2

3=−0.5×8

=−4 .

這類題目換用原碼計算沒有意義,使用的策略不同。所以不必刻意對比原碼計算。此外,題目未說用何種捨入策略,不可以直接想象成用0舍1入,而是直接丟棄。

如果有錯誤,後續更正。

js 浮點數加減總結

說明 眾所周知,js在計算浮點數時候,結果可能會不準確。比如 在chrome中的運算結果 2.2 2.1 4.300000000000001 2.2 1.9 0.30000000000000027 2.2 2.2 4.840000000000001 2.1 0.3 7.000000000000001...

浮點數計算

bigdecimal工具類封裝 public class bigdecimaltool 提供精確的減法運算。param v1 被減數 param v2 減數 return 兩個引數的差 public static double sub double v1,double v2 public stati...

浮點數進行計算

public static void main string args 為什麼會出現這種情況?計算機採用二進位制進行計算,有些資料可以用二進位制表示。如0.5 1 2 2 1 但是有些不行,如0.1,這就好像1 3用十進位制無法準確的表示。計算機採用機器語言來表示數值,即二進位制 名稱意義 原碼正數...