指数表記
電卓や表計算ソフトで、数の桁長が表示幅をオーバーしたとき、「E」という字の混じった表示が出てくることがあります。これは数の表記を、指数を使って概数として表示しているもので、指数表記といいます。「E」は「error」ではなく「exponent(指数)」の「E」です。浮動小数点
多くのコンピュータは、内部ではこの「指数表記」の状態で、数のデータを保持しています(ただし進数はもちろん2進数です)。この際、小数点の位置が桁長によって元の場所から変動するので、これを浮動小数点(floating point)方式といいます。浮動小数点に対比した時の、通常の小数点の表記法が「固定小数点」方式です。浮動小数点(下段)では小数点の位置があちこち移動する
上の図からわかるように、小数点の位置を桁表記で表す固定小数点に対して、浮動小数点ではそれを「E」のあとの数値で表しています。これによって、桁数の大きな数値を表すときにコンピュータのメモリーが節約できますし、大小さまざまな値をいずれも決まった同じ型枠に入れて持ち運ぶことができます。われわれが一般に使用するコンピュータでは、この型枠の大きさは、米国電気電子技術者協会のIEEE(アイトリプルイー)754という規格によって標準化されており、それによれば、「倍精度浮動小数点数形式」という規格で、「指数部」が11ビット(2進桁)、「仮数部」が52ビットです。
この規格において、今われわれがキーボードからある10進法の有限小数を入れ、それが2進変換すると無限小数になるとします。仮数部の型枠には値は52ケまでしか入りませんから、コンピュータはそこから先を四捨五入(2進法では0捨1入)して「丸め(rounding)」た、有限小数の近似値の状態で保持します。そこで、計算内容によっては、そこから出る誤差が表に出てくることがある、というわけです。表計算ソフトでときどきそのようなことが起きることはよく知られていますが、どんなケースでそうなるかを、日経PC21というサイトの「エクセル演算誤差対策講座」という記事でリストアップしていました。
ハル 「計算途中で誤差ができるんですか?」
エリカ 「うん。例えば『=IF((41/10-4)*10>=1,"大きい","小さい")』は『(41/10-4)*10』が 1 だから『大きい』になるはずだ けど『小さい』になってしまう。『41/10』が 4.1 になったところで誤差が発生しているの」
エリカ 「例えば、A1に『14.0』、B1に『14.2』、C1 に『=B1-A1』という式を入れると『0.2』になるよね。これに『kg』という 単位を付けて表示したいと思って、D1に『=C1&"kg"』という式を入れると『0.199999999999999kg』になってしまう」
ハル 「本当ですね…」
手持ちのオープンソースのOfficeソフト「LibreOffice」(OpenOfficeから最近乗り換えました/バージョンは3.3.2)で確認してみましたが、同様の現象が再現されました。
Microsoftの解説ページをみると、ソフトハウスの側でも、これらの異常が極力表に出てこないよう、バージョンを重ねるごとに、いろいろと工夫を凝らしている様子がうかがえます。が、コンピュータが数を扱ういちばん大もとの部分なので、全部を封じ込めるというのはなかなか難しいのかもしれませんね。