本文へジャンプ

(参考)浮動小数点演算と丸め誤差について

この文書は、米国 IBM 社の資料 ("Floating point arithmetic and rounding errors") を翻訳した参考文書です。日本語環境での検証は行っておりませんのでご注意ください。

問題 (Problem)

Lotus Notes では浮動小数点演算をどのように行っているのでしょうか。また、その処理において計算誤算が発生する可能性はあるでしょうか。

解決策 (Solution)

Lotus Notes の浮動小数点演算は、 Institute of Electrical and Electronics Engineers, Inc. (IEEE) が規定した IEEE 754 の 2 進浮動小数点演算規格 (IEEE Standard for Binary Floating-Point Arithmetic) に準拠しています。この規格は浮動小数点演算を行う PC ベースのソフトウェアやコプロセッサの標準として多く使用されています。

IEEE では 10 進数で入力された数値を内部的には 2 進数に変換して保持・演算し、その結果を 10 進数に戻して表示しています。すべての整数は 2 進数であらわすことができますが、小数点を含む数値に関しては有限の桁数の 2 進数で表すことができるものは限られています。そのため、実数を一定の有限桁で丸めるという処理を行うため、10 進数に戻す際に誤差が発生します。

(例)
10 進数の「0.2」を 2 進数であらわすと、下記のような無限小数になります。

0.001100110011001100110011001100110011 (以下繰り返し)

無限小数のままにすることはできないので、例えば 4 バイト変数であるとして 32 ビット分を 10 進数に戻すと「0.19999999995343387」となり、変換誤差が発生します。

IEEE 754 において単精度の符号付き浮動小数 (LotusScript における Single 型) は仮数部に 23 ビット、指数部に 8 ビット、符号に 1 ビットを使用しているので、保持できる桁数は 2 の 23 乗 = 8388608 ~ 10 の 6 乗程度で有効数字は 6 桁程度です。倍精度の符号付き浮動小数 (LotusScript における Double 型) では仮数部に 52 ビット、指数部に 11 ビット、符号に 1 ビットを使用するので 2 の 52 乗 = 4503599627370496 ~ 10 の 15 乗となり、有効数字は 15 桁程度であることがわかります。したがって、浮動小数をデータ型に使用した数値演算を行なう際には、常にこの程度の計算誤差が生じることを念頭に計算結果を考察する必要があります。

上述した丸め誤差のために計算誤差が生じる場合の 1 つの回避策としては、下記のような方法が考えられます。

元の式 : @Integer(6000*2.3)=13799
訂正後 : @Integer(6000*@Round (2.3; 0.0001))

このように、小数点以下を丸めることにより、誤差の発生する頻度を少なくすることができます。

また通貨型は 8 バイトの固定小数点整数なので扱える桁数は大幅に減りますが、このような丸め誤差の影響を受けずに計算を行なうことが出来ます (通貨型は -922,337,203,685,477.5807 ~ 922,337,203,685,477.5807 の数値を扱うことができます)。

補足情報 (Supporting Information)

IEEE に代表される浮動小数を扱うデータ型は、数値の保持に必要な領域を制限しながら大きな桁数の数値を効率よく処理することを目的としており、2 進数への変換もそのために発生しています。上記の説明にあるように、これらの変換によって生じる丸め誤差は浮動小数を扱う上では避けることができません。ほとんどの PC ペースソフトウェアは浮動小数を使用しており、丸め誤差の問題の影響を受けます。

IEEE 754 の詳細については、下記のサイトを参照してください。
IEEE 754: Standard for Binary Floating-Point Arithmetic



2009 IBM Corporation. All rights reserved.
Material may not be reproduced or distributed in any form without permission.

掲載内容は 2009年6月3日 現在の情報です。内容は事前の予告なく変更することがあります。
Lotus Domino、Lotus NotesはIBMの商標。その他、記載された社名および製品名は、それぞれ各社の商標または登録商標です。


 
Lotus software

文書情報

プロダクト・ファミリー
Notes


プロダクト・カテゴリー
Workstation/Desktop > Application Development > @Functions/Formulas


オペレーティングシステム
Windows


ソフトウェア・バージョン
Notes Client 8.x (Standard); Notes Client 8.x (Basic); Notes Client 7.x; Notes Client 6.x; Notes Client 5.x; Notes 4.x


文書番号
729933


最終更新日
2009年6月3日