演算結果が半端な値になる(丸め誤差) [Edit]

Flashのバグ?
以下のステートメントを実行してみましょう。0.01ではなく、0.00099999999999989というような半端な値が返ります。

trace (1.001-1);

JavaScriptでも、演算結果には同様の誤差が生じます。つまり、これはFlashのバグではなく、仕様です(Macromedia TechNote「Flash returns erroneous results for certain mathematical calculations」参照)。こういうものだと思って、諦めましょう。

というのでは、あまりに素っ気ないので、もう少し解説を加えます(でも、結論としては、仕様というしかありません)。

丸め誤差
これは、いわゆる「丸め誤差」(round-off error)といわれるものです。コンピュータは、数値の演算を有限の桁数で行います。そのため、有効桁数以下の桁は四捨五入されます。そこで誤差が発生することになるのです。人間の目からは、1.001-1で誤差の生じる余地はなさそうに見えます。けれど、コンピュータは2進数で計算を行っていることに注意が必要です。

1.001と1では、その差がごく僅かです。このような浮動少数の引き算では、有効桁数が減少する「桁落ち」という誤差の生じることがあるのです。さらに興味のあるマニアックな方は、「丸め誤差」をキーワードにネット検索されることをお勧めします。

ところで、「ActionScript辞書」の%(剰余)の項には「4.3 % 2.1は0.1を返します」とありますが、返しません。ここでも丸め誤差が発生し、0.0999999999999996というような値になります。これは、マニュアルバグだと思われます。ActionScript Dictionary(ActionScript辞書英文改訂版)では、この記述は「約(approximately)0.1」と修正されています。

Fact of Life(人生の現実)
前出Macromedia TechNoteでは、浮動少数の演算で発生するこの丸め誤差は、「fact of life」(人生の現実)だと結論づけています。確かに、コンピュータの演算処理上、この現象は避けられません。適当な桁で四捨五入を行うか、10の累乗を掛合わせて整数として演算を行うしかないと思われます。つまり、こういうものだと思って、諦めましょう。

コメント

この記事へのコメント

  1. 1.attun(2004年04月24日 00:00)

    ぼくもあきらめました。
    というよりも
    0.0001をたして数値を作り直すようなことをしました。

その他の記事