1994年も押し迫った頃発見された。ある特定のビットパターンの浮動小数点数 の割り算をすると計算精度が異常に下がるというもの。IntelのWebページでも そのパターンにはまる確率がいかに低いかを統計的に証明して見せたりしてい た覚えが。もうそんなページ残ってないんだろうな。
我が愛機もこのバグありPentium搭載機なわけなんだけど,そのビットパター ンを調べることができなくて,計算精度がどのくらいないのか知ることができ なかった。残念。
それにしても,このビットパターンを見つけた人って偉いよね。おそらくなに かの数値計算かなんかをしていて思ってるような答えが出ないんで見つけたん だろうけど,特定しちゃうところが偉い。
確か,NECの対応はこれはバグありPentiumだから取り替えろ!ってバグありの CPUをNECに送り返すと,対策済のCPUを送ってもらえるというものだった気が。 あたしは面倒だったんでバグありのまま使い続けたけど。
そういえば,同じ時期,MS-Windows3.1に付属のソフト「電卓」が計算を間違 うってのも話題になっていた。これは簡単に再現できる。2.01-2を計算すると, 答えがなんと0になってしまうというもの。まあ,あたしの場合はいつも本当 の電卓をわきに置いて使ってるんで,このバグの影響は受けなかったけど。
1999/05/28 記す
基本的に、fdiv のバグって奴は、ある特定のビットパターンに関して演算す ると、異常に計算精度が下がるというもの。最近、ふと、バグパターンが見つ けられていなかったことを思い出して、 google で検索するとあっさり判明。 http://vig.prenhall.com/samplechapter/0789725363.pdf なんていう文書を残しておいてくれた人に感謝。
この文書によると、double(64bit floating point number) 同士の割り算のと きに、通常なら 12 〜 13 桁くらいは精度があるところを、ビットパターンに よって、真の値から 3 〜 6 桁目で違う値になってしまうという。この文書に は、それぞれ 3, 5, 6 桁目から値がずれてしまう例が載っていた。
962,306,957,033 / 11,010,046 = 87,402.6282027341 (correct answer)
962,306,957,033 / 11,010,046 = 87,399.5805831329 (flawed Pentium)4,195,835 / 3,145,727 = 1.33382044913624100 (correct answer)
4,195,835 / 3,145,727 = 1.33373906890203759 (flawed Pentium)5,505,001 / 294,911 = 18.66665197 (correct answer)
5,505,001 / 294,911 = 18.66600093 (flawed Pentium)
さっそく ibuki で試してみたら、きっちり flawed Pentium の値を再現。め でたくなしめでたくなし。
2001/10/26 追記