文書番号: 78113 - 最終更新日: 2007年3月19日 - リビジョン: 6.2 Excel で浮動小数点演算の結果が正しくない場合があるこの記事は、以前は次の ID で公開されていました: JP78113 目次概要
この資料では、Microsoft Excel での浮動小数点数の格納方法および計算方法について説明します。丸めやデータの切り捨てに伴って、一部の数値または数式の結果に影響が及ぶ場合があります。
概要Microsoft Excel では、浮動小数点数の格納および計算は、IEEE 754 の規格に沿って設計されています。IEEE とは、Institute of Electrical and Electronics Engineers の略で、コンピュータのソフトウェアおよびハードウェアの標準規格を策定している国際的な団体です。IEEE 754 規格は、2 進コンピュータでの浮動小数点数の格納方法について定めたもので、きわめて広く採用されています。この規格が広く利用されているのは、浮動小数点数を適度な容量の領域に格納でき、計算を比較的高速に実行できるという理由からです。IEEE 754 規格は、Intel、Motorola、Sun の各プロセッサや MIPS プロセッサなど、浮動小数点演算を実装する今日の PC ベースのマイクロプロセッサほぼすべてにおいて、浮動小数点ユニットおよび数値データ プロセッサで使用されています。数値を格納するときには、すべての数や分数が、対応する 2 進数で表現されます。たとえば、1/10 という分数は、10 進法では 0.1 と表現できるのに対し、同じ数を 2 進数で表現すると、次のような循環 2 進数になります。
0001100110011100110011 (以下繰り返し)
この数値は、上記のように無限に繰り返され、有限量の領域では表現できません。したがって、この数値が格納されるときには、約 -2.8E-17 で丸められます。
しかし、IEEE 754 規格には若干の制約があります。大きく分けると、次の 3 つの制約です。
詳細最大/最小の制限処理できる数の最大値と最小値は、どのコンピュータにも必ずあります。数値が格納されるメモリのビット数は有限であるため、格納できる最大値または最小値も有限です。Excel の場合、格納できる最大値は 1.79769313486232E+308、格納できる正の最小値は 2.2250738585072E-308 です。IEEE 754 に準拠している部分
IEEE 754 に準拠していない部分
精度浮動小数点数は、65 ビットの範囲内に 2 進数で格納され、符号、指数、および仮数という 3 つの部分に分かれています。元に戻す
符号部には数値の符号 (正または負) が格納され、指数部には数値に掛ける 2 の累乗を示す値が格納され (2 の最大の累乗は +1,023、最小の累乗は -1,022)、仮数部には実際の数値が格納されます。仮数の格納領域は有限であるため、隣り合った浮動小数点数どうしの差の小ささ (つまり精度) には限度があります。 仮数と指数はそれぞれ別個の構成要素として格納されます。この結果、扱う対象の数値 (仮数) のサイズに応じて、取り得る精度に幅が生じる可能性があります。Excel の場合、格納できる数値は 1.79769313486232E308 〜 2.2250738585072E-308 ですが、15 桁の精度の範囲内でのみ表現できます。この制限は、IEEE 754 規格に厳密に従ったことの直接的な結果によるものであり、Excel の制限ではありません。このレベルの精度は、他のスプレッドシート プログラムでも同様に見られます。 浮動小数点数は次の形式で表現されます。exponent は 2 進指数です。
X = Fraction * 2^(exponent - bias) Fraction は正規化された数値の小数部分です。正規化するのは、先頭ビットが常に 1 になるように指数が調整されているためです。こうすると、先頭ビットは格納の必要がなくなり、精度が 1 ビット増えます。暗黙ビットが存在するのはこのためです。これは、科学的記数法の指数表記において、小数点の左側が 1 桁となるように指数を操作するのと同様です。ただし、2 進数の場合は、1 と 0 しかないため、先頭ビットが 1 となるように指数を操作することは常に可能です。
Bias は、負の指数を格納する必要性を避けるために使用するバイアス値です。バイアスは、単精度の数値では 127、倍精度の数値では 1,023 (10 進) です。Excel では、数値は倍精度で格納されます。 非常に大きな数値の使用例新しいブックに次のように入力します。A1: 1.2E+200 B1: 1E+100 C1: =A1+B1 非常に小さな数値の使用例新しいブックに次のように入力します。A1: 0.000123456789012345 B1: 1 C1: =A1+B1 精度の誤差を修正するExcel には、丸め誤差を補正するための基本的な方法が 2 つ用意されています。1 つは ROUND 関数、もう 1 つはブックの [表示桁数で計算する] オプションです。方法 1 : ROUND 関数次の例では、先ほどのデータを使用し、ROUND 関数で数値を強制的に 5 桁にしています。このようにすることにより、結果を他の値と正しく比較することができます。A1: 1.2E+200 B1: 1E+100 C1: =ROUND(A1+B1,5)
結果は 1.2E+200 になります。
D1: =IF(C1=1.2E+200, TRUE, FALSE)
結果は値 TRUE になります。 方法 2 : 表示桁数で計算場合によっては、[表示桁数で計算する] オプションを使用して、丸め誤差による影響を回避できる場合があります。このオプションを使用すると、ワークシートの各数値が、表示されている値に強制的に変更されます。このオプションを有効にするには、次の手順を実行します。
循環 2 進数および結果がゼロに近い計算2 進数での浮動小数点数の格納には、混乱を招く問題がもう 1 つあります。10 進数では繰り返しのない有限の値として表現されるのに、2 進数では無限に繰り返される数値として表現される場合があるということです。典型的な例が、値 0.1 やその類例です。これらの数値は、基数 10 ではきちんと表現されますが、2 進数で表現すると、仮数に格納したときに次のような循環 2 進数となります。
000110011001100110011 (以下繰り返し)
IEEE 754 規格では、どのような数値に対しても、特別な規定はありません。仮数に格納できる分が格納され、残りは切り捨てられます。この結果、格納時には、約 -2.8E-17 (0.000000000000000028) という誤差が生じます。
0.0001 のような、10 進ではごく普通の小数でも、2 進数では正確に表現できません (0.0001 は周期 104 ビットの循環 2 進小数です)。これは、分数 1/3 を 10 進数では正確に表現できない (0.33333333333333333333 という循環小数になる) のと似ています。 Microsoft Visual Basic for Applications による、次の簡単な例を見てください。 負数の和を求める例
値がゼロに達する例
一方、Excel 97 では、この問題の修正を試みる最適化が導入されています。加算または減算の結果がゼロになるか、またはゼロに非常に近い値になる場合、Excel 97 以降では、オペランドを 2 進数に変換したりその逆の処理を行ったりした影響で生じた誤差が補正されます。上記の例を Excel 97 以降で実行すると、正しく 0 (指数表記では 0.000000000000000E+00) と表示されます。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。 172911?
(http://support.microsoft.com/kb/172911/
)
非常に大きな指数または非常に小さな指数で 10 を累乗すると誤った結果が返される
214373?
(http://support.microsoft.com/kb/214373/
)
[XL2000] 非常に大きな指数または非常に小さな指数で 10 を累乗すると誤った結果が返される
浮動小数点数と IEEE 754 規格の詳細については、次の Web サイトを参照してください。
http://www.ieee.org
(http://www.ieee.org)
http://steve.hollasch.net/cgindex/coding/ieeefloat.html (http://steve.hollasch.net/cgindex/coding/ieeefloat.html) 関連情報この資料は以下の製品について記述したものです。
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。" | サポート技術情報の翻訳
|
先頭へ戻る
