計算された結果 = 正しい結果 + 丸め
丸めがどれだけ大きくなる場合があるかを示す便利な尺度の 1 つとして、最終桁単位 (「unit in the last place」を略して ulp) と呼ばれるものがあります。浮動小数点数のその標準の表現における小数部の最下位ビットは、その最終桁です。このビットによって表される値 (たとえば、このビット以外は表現が同じである 2 つの数値の絶対的な違い) は、その数値の最終桁単位です。計算された結果が正しい結果をもっとも近い表現可能な数値に丸めることによって取得された場合は、明らかに、丸め誤差が計算された結果の最終桁単位の半分より大きくなることはありません。言い換えると、もっとも近い値への丸めモードの IEEE 演算では、次の計算結果になります。
0 ≤ |丸め| ≤½ulp
ulp が相対的な量であることに注意してください。非常に大きな数値の ulp はそれ自体が非常に大きいのに対して、非常に小さい数値の ulp はそれ自体が非常に小さくなります。この関係は、ulp を関数として表すことによって明示的にすることができます。ulp(x) は、浮動小数点数 x の最終桁単位を示します。
さらに、浮動小数点数の ulp は、その数値が表される精度によって異なります。たとえば、Table 2–12 は、前に説明した 4 つの各浮動小数点形式での ulp(1) の値を示しています。
|
前に説明したように、どのコンピュータ演算でも、正確に表すことができる数値のセットは有限数しか存在しません。数値の大きさが小さくなり、0 に近づくにつれて、隣接する表現可能な数値の間隔は狭くなります。逆に、数値の大きさが大きくなるにつれて、隣接する表現可能な数値の間隔は広がります。
たとえば、3 ビットの精度しかない 2 進演算を使用しているとします。この場合は、次の図に示すように、任意の 2 つの 2 のべき乗の間には 23 = 8 個の表現可能な数値があります。
図 2-6 数直線
この数直線は、指数が 1 増えるごとに数値の間隔が 2 倍になる様子を示しています。
IEEE 単精度形式では、2 つの最小の正の非正規数の大きさの違いが約 10-45 であるのに対して、2 つの最大の有限数の大きさの違いは実に約 1031 もあります。
Table 2–13 で、nextafter(x,+∞) は、数直線に沿って +∞ に向かって移動したとき、x のあとの次の表現可能な数値を示しています。
|
表現可能な浮動小数点数の従来のどのセットも、1 つの不正確な結果の最悪の影響によって、計算された結果の表現可能な近傍のいずれかとの間隔より悪化することはない誤差が導入されるという属性を備えています。表現可能なセットに非正規数が追加されたときに、段階的アンダーフローが実装されている場合は、1 つの不正確な、またはアンダーフローした結果の最悪の影響によって、計算された結果の表現可能な近傍のいずれかとの間隔を超えることはない誤差が導入されます。
特に、0 と最小の正規数の間の領域では、任意の 2 つの隣接する数値の間隔は 0 と最小の非正規数の間隔に等しくなります。 非正規数の存在によって、もっとも近い表現可能な数値との間隔を超える丸め誤差が導入される可能性が排除されます。
どの計算も、計算された結果の表現可能な近傍のいずれかとの間隔を超える丸め誤差を招くことはないため、堅牢な演算環境の多くの重要な属性が保持されます。これには、次の 3 つが含まれます。
x – y ≠ 0 の場合のみ x ≠ y
x と y のうちの大きい方の丸め誤差以内まで、(x – y) + y ≈ x
x が正規化数のとき、1/(1/x) ≈ x。つまり、最大の正規化数 x についても 1/x ≠ 0
代替のアンダーフロースキームは、アンダーフローの結果を 0 にフラッシュする突発的アンダーフローです。 突発的アンダーフローは、x – y がアンダーフローした場合は常に、最初の属性と 2 番目の属性に違反します。突発的アンダーフローはまた、1/x がアンダーフローした場合は常に、3 番目の属性にも違反します。
λが最小の正の正規化数 (アンダーフローしきい値とも呼ばれます) を表すものとします。 この場合、段階的アンダーフローと突発的アンダーフローの誤差の属性はλの観点から比較できます。
段階的アンダーフロー: |誤差| < λの ½ulp
突発的アンダーフロー: |誤差| ≈ λ
λの最終桁単位の半分とλ自体には大きな違いがあります。