0.01+0.09=0.0: [Edit]

「:」って何?
「ゲジラって何よ?」というCMがありますが、Flash 5でも思わずそう聞きたくなることがあります。

n = 0.01+0.09;
trace (n);
//出力ウィンドウの結果
0.0:

「0.0」までは、まがりなりにも数字です。その後の「:」が何なのでしょう。まるで意味のない値になってしまった、という訳ではないようです。

0.1と等しくて等しくない?
続けて、以下を試してみます。

trace (n+1);
trace (typeof (n));
//出力ウィンドウの結果
1.1
number

1を足せば1.1、typeof演算子で値を調べると"number"と評価されています(traceやtypeofについて、詳しくは「ActionScript辞書」をご参照ください)。では、表示はさておき、Flash内では0.1と認識されているかというと、そうではありません。

trace (n == 0.1);
trace (n+1-1);
//出力ウィンドウの結果
false
0.1

0.1と等しくはありません(false)。でも、1を加えて1を引くと、0.1です。訳がわかりません。

謎はすべて解けた?
謎を解くカギが、丸め誤差です。浮動小数の演算では、コンピュータが有限の桁数を使って演算をするために、わずかな誤差の生ずることがあります。ここでも、それが発生しているのではないか、ということです。

それを確認するために、比較演算子で値の範囲を調べてみます。追求の末、以下の結果が得られました。

trace (n<0.1);
trace (n>0.0999999999999999);
//出力ウィンドウの結果
true
true


つまり見た目はともかく、値は0.0999999999999999より大きく0.1より小さい数値として認識されているようです。値に対して他の演算を行っても、とくにエラーを返すこともなく、整合性のある結果を返します。1を加えると、丸め誤差がまた丸められ、1.1という正規の値に戻ったのでしょう。

どうやら、0.01+0.09は演算結果に丸め誤差を生じ、その結果の出力段階でいわば文字化けを起こしているようです。

  _____

作成者: 野中文雄
作成日: 2001年11月10日 誤字修正
作成日: 2001年9月24日

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事