描述:
對實數進行計算時,由于實數的結構 (指數形式) 以及非常大的數值范圍,經常會發生舍入誤差,因此兩個數值相等的情況 (所有位都相同) 幾乎不會出現。所以比較兩個實數是否“相等”通常難以獲得預期的結果。因此您必須采用其它的方法。其中一種方法是采用近似值的方法。本條目介紹了一種您可以據以判斷實數是否“相等”的近似值算法,還包含了一個應用該近似值算法的實例。本條目還簡要介紹了實數的格式。 比較實數值是否相等的近似值
此處所述的比較實數所用的近似值基于以下公式: |(a -b)/(|a| + |b|)| < eps
該近似值可用語言表述如下:
當 a 和 b 之差與 a 和 b 的絕對值之和的比值的絕對值小于“eps”的值時,2 個數值“a”和“b”即被視為相等。 其中需要考慮公式的下列屬性: 1. 如果實數“a”和“b”的值非常大,則即使它們相差比較大也被視為等值,此時必須根據系統的需求降低“eps”的值。
如果實數“a”和“b”的值非常小,則只有兩數值相差很小時才被視為等值。 注意事項:
此處請注意在一個實數的尾數中,最多只能顯示 6 個連續的十六進制數字。 例如
| 數值舉例 1 | 數值舉例 2 | (|a| + |b|) | 5 | 5000000 | “eps” | 10-6 [0.000001] | “a”和“b”可被視為相等時“a”和“b”的差值 | 0.00000499... | 4.999... | 表 01
2. 如果“a”和“b”兩值都為 0,則“a”和“b”的和也是 0。被 0 除是不允許的且會導致錯誤結果。因此不能使用近似值比較兩個恰好都為 0 的實數“a”和“b”! 3. 如果兩個被比較的實數有一個是 0,那么也不使用這個公式計算近似值。近似值結果通常為 1。因此比較結果常常是“不相等”,除非“eps”被設定比 1 大。 注意事項: - 如果已經發生了被 0 除的操作,則 CPU 通過置位狀態位 OS、OV、A0 和 A1 來指示這一錯誤。
- 如果數學函數的結果為 0,則兩個狀態位 A0 和 A1 不置位。
|