IEEE-754 中的舍入方法
IEEE-754 中的舍入方法
并非所有實數(shù)都可以精確地存儲為浮點數(shù)。
考慮一個以歸一化浮點數(shù)形式表示的實數(shù):
x
=
±
1.
b
1
b
2
b
3
.
.
.
b
n
.
.
.
×
2
m
x = \pm 1.b_1 b_2 b_3 ... b_n ... \times 2^m
x=±1.b1?b2?b3?...bn?...×2m,其中
n
n
n 是尾數(shù)中的位數(shù),
m
m
m 是給定浮點數(shù)系統(tǒng)的指數(shù)。若
x
x
x 沒有精確的浮點數(shù)表示,則會用最近的兩個浮點數(shù)
x
?
x_{-}
x?? 或
x
+
x_{+}
x+? 來表示。
為簡化討論,設(shè)
x
x
x 為一個正數(shù)。在此情形下,有:
x
?
=
1.
b
1
b
2
b
3
.
.
.
b
n
×
2
m
x_{-} = 1.b_1 b_2 b_3 ... b_n \times 2^m
x??=1.b1?b2?b3?...bn?×2m 和
x
+
=
1.
b
1
b
2
b
3
.
.
.
b
n
×
2
m
+
0.
000000...0001
?
n
位
×
2
m
x_{+} = 1.b_1 b_2 b_3 ... b_n \times 2^m + 0.\underbrace{000000...0001}_{n\text{ 位}} \times 2^m
x+?=1.b1?b2?b3?...bn?×2m+0.n 位
000000...0001??×2m ,將實數(shù)
x
x
x替換為附近的機器數(shù)(
x
?
x_{-}
x??或
x
+
x_{+}
x+?)的過程稱為 舍入,其中涉及的誤差稱為 舍入誤差。

IEEE-754 并未明確規(guī)定如何舍入浮點數(shù),但有幾種不同的方法:
- 向零舍入
- 向正無窮舍入
- 向上舍入
- 向下舍入
- 向最近的浮點數(shù)舍入(向上或向下,取決于哪個更近)
- 截斷舍入
我們將浮點數(shù)表示為 f l ( x ) fl(x) fl(x)。上述舍入規(guī)則可以總結(jié)如下:
| x x x為正數(shù) | x x x為負數(shù) | |
|---|---|---|
| 向上取整(ceil) |
f
l
(
x
)
=
x
+
fl(x)=x_+
fl(x)=x+? 向 + ∞ +\infty +∞取整 |
f
l
(
x
)
=
x
?
fl(x)=x_-
fl(x)=x?? 向 0 0 0取整 |
| 向下取整(floor) |
f
l
(
x
)
=
x
?
fl(x)=x_-
fl(x)=x?? 向 0 0 0取整 |
f
l
(
x
)
=
x
+
fl(x)=x_+
fl(x)=x+? 向 ? ∞ -\infty ?∞取整 |
截斷舍入: f l ( x ) = x ? fl(x) = x_{-} fl(x)=x??
舍入誤差
注意,兩個機器數(shù)之間的差距為: ∣ x + ? x ? ∣ = 0. 000000...0001 ? n 位 × 2 m = ? m × 2 m |x_{+} - x_{-}| = 0.\underbrace{000000...0001}_{n\text{ 位}} \times 2^m = \epsilon_m \times 2^m ∣x+??x??∣=0.n 位 000000...0001??×2m=?m?×2m。因此,我們可以使用機器 epsilon 來限制將實數(shù)表示為機器數(shù)時的誤差。
絕對誤差
∣ f l ( x ) ? x ∣ ≤ ∣ x + ? x ? ∣ = ? m × 2 m |fl(x) - x| \le |x_{+} - x_{-}| = \epsilon_m \times 2^m ∣fl(x)?x∣≤∣x+??x??∣=?m?×2m
∣ f l ( x ) ? x ∣ ≤ ? m × 2 m |fl(x) - x| \le \epsilon_m \times 2^m ∣fl(x)?x∣≤?m?×2m
相對誤差:
∣ f l ( x ) ? x ∣ ∣ x ∣ ≤ ? m × 2 m ∣ x ∣ \dfrac{|fl(x) - x|}{|x|} \le \dfrac{\epsilon_m \times 2^m}{|x|} ∣x∣∣fl(x)?x∣?≤∣x∣?m?×2m?
∣ f l ( x ) ? x ∣ ∣ x ∣ ≤ ? m \dfrac{|fl(x) - x|}{|x|} \le \epsilon_m ∣x∣∣fl(x)?x∣?≤?m?
浮點運算的數(shù)學性質(zhì)
-
不一定滿足結(jié)合律: ( x + y ) + z ≠ x + ( y + z ) (x + y) + z \neq x + (y + z) (x+y)+z=x+(y+z),因為 f l ( f l ( x + y ) + z ) ≠ f l ( x + f l ( y + z ) ) fl(fl(x + y) + z) \neq fl(x + fl(y + z)) fl(fl(x+y)+z)=fl(x+fl(y+z))。
-
不一定滿足分配律: z ? ( x + y ) ≠ z ? x + z ? y z \cdot (x + y) \neq z \cdot x + z \cdot y z?(x+y)=z?x+z?y,因為 f l ( z ? f l ( x + y ) ) ≠ f l ( f l ( z ? x ) + f l ( z ? y ) ) fl(z \cdot fl(x + y)) \neq fl(fl(z \cdot x) + fl(z \cdot y)) fl(z?fl(x+y))=fl(fl(z?x)+fl(z?y))。
-
不一定滿足累積性:反復(fù)將一個非常小的數(shù)加到一個大數(shù)上可能沒有任何效果。
浮點加法
將兩個浮點數(shù)相加相對簡單。基本思路是:
- 將兩個數(shù)調(diào)整到相同的指數(shù)。
- 從前面開始進行小學加法,直到用完系統(tǒng)中的位數(shù)。
- 對結(jié)果進行舍入。
例如,為了在一個只有 3 位小數(shù)部分的浮點系統(tǒng)中將
a
=
(
1.101
)
2
×
2
1
a = (1.101)_2 \times 2^1
a=(1.101)2?×21 和
b
=
(
1.001
)
2
×
2
?
1
b = (1.001)_2 \times 2^{-1}
b=(1.001)2?×2?1 相加,這將如下所示:
a
=
1.101
×
2
1
b
=
0.01001
×
2
1
a
+
b
=
1.111
×
2
1
a=1.101\times 2^1 \\b=0.01001\times 2^1\\ a+b=1.111\times 2^1
a=1.101×21b=0.01001×21a+b=1.111×21
你會注意到,我們加了兩個具有 4 位有效數(shù)字的數(shù),結(jié)果也有 4 位有效數(shù)字。浮點加法中沒有有效數(shù)字的損失。
浮點減法與災(zāi)難性消去
浮點減法的工作原理與加法類似。然而,當減去兩個大小相近的數(shù)時,會出現(xiàn)問題。
例如,為了從
a
=
(
1.1011
)
2
×
2
1
a = (1.1011)_2 \times 2^1
a=(1.1011)2?×21 中減去
b
=
(
1.1010
)
2
×
2
1
b = (1.1010)_2 \times 2^1
b=(1.1010)2?×21,這將如下所示:
a
=
1.1011
?
?
?
?
×
2
1
b
=
1.1010
?
?
?
?
×
2
1
a
?
b
=
0.0001
?
?
?
?
×
2
1
a=1.1011????\times 2^1\\ b=1.1010????\times 2^1\\ a-b=0.0001????\times 2^1
a=1.1011????×21b=1.1010????×21a?b=0.0001????×21
當我們對結(jié)果進行歸一化時,得到
1.
?
?
?
?
×
2
?
3
1.???? \times 2^{-3}
1.????×2?3。沒有數(shù)據(jù)可以指示缺失的數(shù)字應(yīng)該是什么。盡管浮點數(shù)將存儲 4 位小數(shù)部分,但它只準確到 1 位有效數(shù)字。這種有效數(shù)字的損失稱為 災(zāi)難性消去。
示例
考慮函數(shù)
f
(
x
)
=
x
2
+
1
?
1
f(x) = \sqrt{x^{2} + 1} - 1
f(x)=x2+1??1。當我們在接近零的值處評估
f
(
x
)
f(x)
f(x) 時,可能會由于浮點減法而遇到有效數(shù)字的損失。如果
x
=
1
0
?
3
x = 10^{-3}
x=10?3,使用五位小數(shù)算術(shù),
f
(
1
0
?
3
)
=
1
0
?
6
+
1
?
1
=
0
f(10^{-3}) = \sqrt{10^{-6} + 1} - 1 = 0
f(10?3)=10?6+1??1=0。
避免有效數(shù)字損失的一種方法是消除減法:
f
(
x
)
=
x
2
+
1
?
1
=
(
x
2
+
1
?
1
)
?
(
x
2
+
1
+
1
)
x
2
+
1
+
1
=
x
2
(
x
2
+
1
+
1
)
f(x) = \sqrt{x^{2} + 1} - 1 = \dfrac{ (\sqrt{x^{2} + 1} - 1) \cdot (\sqrt{x^{2} + 1} + 1) } { \sqrt{x^{2} + 1} + 1 } = \dfrac{ x^{2} } { (\sqrt{x^{2} + 1} + 1) }
f(x)=x2+1??1=x2+1?+1(x2+1??1)?(x2+1?+1)?=(x2+1?+1)x2?
因此,對于
x
=
1
0
?
3
x = 10^{-3}
x=10?3,使用五位小數(shù)算術(shù),
f
(
1
0
?
3
)
=
1
0
?
6
2
f(10^{-3}) = \dfrac{ 10^{-6} } { 2 }
f(10?3)=210?6?。

浙公網(wǎng)安備 33010602011771號