丸め誤差で散々悩む

Rhinoを使ってスクリプティングをちょっと試してたところ、妙な計算結果に遭遇。

(100.5-30.4)*15.2=1065.5199999999998

掛け算しかしていないんですけど…。
全く原因がわかららず、

  windowsの電卓 誤差無し
  Ruby(1.8.5)   誤差無し
  ActivePerl    誤差無し

で試してみる。でも正しく計算されてしまいました。
これってRhinoのバグかしら。Bugzillaの使い方覚えなくちゃかしら。
とか考えるほど混乱。
頭を冷やすため、それからしばらくこの件は放置していました。

先日Firefox3のβをいじっていたところ、不意にこの件を思い出し、
javascriptの処理系が違ったら…ということで調べてみることに。
Firefox3とIE7で同じ計算をさせたところ、同じ誤差が発生し
バグでないことが判明しました。

これ何なのさ…と調べ、"2進数表現による丸め誤差" という結論に
たどり着きました。

長かった…。

ついでに手元にある他の処理系で試してみた。

【誤差有り】
  java(6)
  jruby(1.1 java6) (javaの影響)
  Firefox(3 bate5)
  IE(7)
【誤差無し】
  C#(C#3.0)
  C++(VC++9.0)

C++で丸め誤差が発生しないのはびっくり。古めの言語だから逆に仕様として
Javaのように丸め誤差が残っているものと思っていたのに。
Microsoftが気を利かせたのか、ISOの標準C++とかだとOKなのか。
面倒臭がって調べていない。
JavaはBigDecimalとかのクラスによって解決法を提供しているため、
言語仕様では(わざと?)誤差が残っているみたい。
 
 

コメント

このブログの人気の投稿

日食ツアーその後

NashornがOpenJDKのリポジトリに入ってたのでビルドしてみた

Javaのクロージャをいじってみた。(1)