知識ベース

ガードディジット

数値分析では、1つ以上のガードディジットを使用して、丸め誤差の量を減らすことができます。

たとえば、長いマルチステップ計算の最終結果を小数点以下N桁に安全に丸めることができるとします。つまり、この最終的な丸めによって導入された丸め誤差は、全体的な不確実性に対してごくわずかな寄与しかしません。

ただし、計算の中間ステップを同じ桁数に丸めることは安全ではない可能性が非常に高くなります。丸め誤差は累積する可能性があることに注意してください。中間計算でM個の小数点以下桁数が使用される場合、 M-Nガードディジットがあると言います。

ガードディジットは、ほとんどのコンピューターシステムの浮動小数点演算でも使用されます。 21×0.1002-20×0.1112 {\ displaystyle 2 ^ {1} \ times 0.100_ {2} -2 ^ {0} \ times 0.111_ {2}}の場合、バイナリポイントを整列させる必要があります。これは、第1オペランドに余分な数字、つまり保護数字を追加する必要があることを意味します。これにより、21×0.10002−21×0.01112 {\ displaystyle 2 ^ {1} \ times 0.1000_ {2} -2 ^ {1} \ times 0.0111_ {2}}が得られます。この操作を実行すると、21×0.00012 {\ displaystyle 2 ^ {1} \ times 0.0001_ {2}}または2−2×0.1002 {\ displaystyle 2 ^ {-2} \ times 0.100_ {2}}が得られます。ガードディジットを使用しない場合、21×​​0.1002−21×0.0112 {\ displaystyle 2 ^ {1} \ times 0.100_ {2} -2 ^ {1} \ times 0.011_ {2}}となり、21×0.0012 = { \ displaystyle 2 ^ {1} \ times 0.001_ {2} =}または2−1×0.1002 {\ displaystyle 2 ^ {-1} \ times 0.100_ {2}}。これにより、1の相対誤差が得られます。したがって、ガードディジットの重要性を確認できます。

浮動小数点の丸めにより発生するエラーの例を、次のCコードに示します。

int main(){double a; int i; a = 0.2; a + = 0.1; a-= 0.3; for(i = 0; a 1.0; i ++)a + = a; printf( "i =%d、a =%f \ n"、i、a); 0を返します。 }

プログラムは終了しないはずです。しかし、出力は次のとおりです。

i = 54、a = 1.000000

別の例:

2つの数字を取る:

2.56 ∗ 100 {\ displaystyle 2.56 * 10 ^ {0}}および2.34 ∗ 102 {\ displaystyle 2.34 * 10 ^ {2}}

最初の数値を2番目の数値と同じ10 {\ displaystyle 10}の累乗にします。

0.0256 ∗ 102 {\ displaystyle 0.0256 * 10 ^ {2}}

2つの数字の追加は次のとおりです。

0.0256 * 10 ^ 2 2.3400 * 10 ^ 2 + ____________ 2.3656 * 10 ^ 2

2番目の数値(つまり、2.34 ∗ 102 {\ displaystyle 2.34 * 10 ^ {2}})に2つの0 {\ displaystyle 0}をパディングした後、4 {\ displaystyle 4}の後のビットがガードディジットであり、ビットafterは丸数字です。丸め後の結果は、2.36 {\ displaystyle 2.36}ではなく2.37 {\ displaystyle 2.37}であり、余分なビット(ガードビットおよびラウンドビット)がないため、0.02 + 2.34 = 2.36 {\ displaystyle 0.02 + 2.34 = 2.36のみを考慮した場合}。したがって、エラーは0.01 {\ displaystyle 0.01}です。