前の質問 質問一覧 次の質問

7. 浮動小数点数の配列の先頭と最後の要素を入れ替えると合計値が変わる

プログラム QandAd07.java

class QandAd07 {

public static void main(String args[]) {

double [] data = { 992.0, 790.1, 24.2, 0.1 };

double sum = 0.0;
for(int i=0; i<data.length; i++) {
sum = sum + data[i];
}
System.out.println(sum);

double [] data2 = { 0.1, 790.1, 24.2, 992.0 };

sum = 0.0;
for(int i=0; i<data2.length; i++) {
sum = sum + data2[i];
}
System.out.println(sum);
}
}

qandad07-1.gif

【原因】

double の有効数字は約16桁、 float の有効数字は約7桁です。 7.2 まるめ(有限な桁で表すための限界) 参照。

上記はの結果は、有効数字16桁の範囲で等しいといえます。 質問は、順序が違うだけでなぜ結果が異なるか?、ということだと思います。

浮動小数点数の加算をする場合、絶対値の大きい数を基準に、 小さい数の有効数字の桁をそろえて加えます。 絶対値の小さな数は、いつも同じ値というわけにはいかず、 相手方の絶対値によって誤差の大小が(ほんのわずかですが)変わります。

この状況を観察してみましょう。 プログラム DoubleDemo5.java

0.10.0 に加算する場合と、 1.0 に加算する場合について、 合計値がどのように変化するかを表示してみます。

実行結果

DoubleDemo5-1.gif



0.2 → 0.3 では多めに、 0.7 → 0.8 では少なめに増えていることがわかります。








1.0 〜 1.9 の範囲では、いずれも多めに増えています。


Top Page
更新日:2006-06-17