(完了) チュートリアルに IEEE 浮動小数点エラーについて理解します。

文書翻訳 文書翻訳
文書番号: 42980 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

浮動小数点数値演算は、多くのプログラマを confuses する複雑なトピックです。 次のチュートリアルは、浮動小数点エラーが発生する可能性がプログラミングの状況とその回避方法を認識するのに役立ちます。 これは、必要がありますもすることは実際のコンパイラのバグにではなく固有の浮動小数点演算の制限によって発生するケースを認識します。

詳細

10 進数とバイナリ番号システム

通常、底 10 でおカウントします。 底は完全に任意です。 これは、棚卸の便利なツールを行ったが、10 の指があるという人が底 10 を使用して従来ことのみためです。

10 進数 (基数 10) の番号 532.25 は次のことを意味します。
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

バイナリ番号システム (基本 2) で各列は 10 ではなく 2 の累乗を表します。 たとえば、数 101.01 は、以下。
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

PC での整数の表示方法

整数への小数部がないためにはコンピューターの表現は浮動小数点の値よりもずっとです。 パーソナル コンピューター (PC) で通常の整数は符号を示す最上位ビットが長いの 2 バイト (16 ビット) です。 長整数は 4 バイト長です。 正の値は単純なバイナリ番号です。 たとえば。
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

ただし、負の整数の 2 の補数スキームを使って表されます。 2 の補数の表現に負の数値を取得するには、数の絶対値のバイナリ表現を行うと、すべてのビットを反転し、追加 1 します。 たとえば。
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

その -1 をメモ 10 進 1111年 1111年 = 理由 Basic では -1 を論理 True として扱いますを説明するバイナリで 1111年 1111年 (すべてのビット = 1)。 これはなく別の演算子とビットごとの論理比較のための結果です。 多くの場合、Basic では、便利だとき、プログラムを行う多くの論理比較の下のコードを使用します。 これは読みやすさが大幅に役立ちます。
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

正しい結果を生成する番号化を使用する通常のバイナリ算術を補完の 2 つの組み合わせてを追加することを確認します。

浮動小数点の複雑さ

すべて 10 進数の整数は、バイナリ整数で正確に表現できる、ただし、これはいない小数についてます。 実際には、底 10 で irrational いるすべての番号に 10 より小さいをベースと任意のシステムで irrational もなります。

バイナリの具体的には、のみ小数、フォーム p/q、q が 2 の整数乗で表現できる表現できる正確にビット数が限られました。

10 進値など、小数でも共通バイナリで正確に表示できません。 値が 104 ビットのピリオドで繰り返しバイナリ分数!

これは、ため、次のような簡単な例について説明します
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

PRINT 1.000054 としては出力されます。 バイナリ形式の値を表すで小さなエラー合計に反映されます。

同じ理由から、常にあります非常に注意実数で比較を行う場合。 一般的なプログラミング エラー次の例します。
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

これは印刷されない等値! 69.82 を正確には多少異なる (バイナリ) でへの代入から結果値がバイナリで表現できないため、式から生成される値よりもします。 番号実習をコード必要がありますこのようないくつかのトレランスを許可するとしてように比較。 たとえば。
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

「等しい」を印刷このされます。

IEEE 形式番号

MS-DOS、バージョン 3. 0 用の QuickBasic が、MBF (バイナリのフローティング ポイントにある) のバージョンと、数値演算コプロセッサがコンピューターの IEEE (米国電気および電子エンジニア) バージョンに付属します。 MS-DOS 用の QuickBasic、バージョン 4. 0 およびそれ以降のみを使用 IEEE します。 マイクロソフトは、IEEE 標準を次の 3 つプライマリ理由のため現在のバージョンの基本的な浮動小数点値を表すを選択しました。
  1. Intel の数学 coprocessors、どの使用 IEEE 形式の使用をできるようにします。 Intel 80 x 87 系列 coprocessors Microsoft バイナリ形式の数値を扱うことはできません。
  2. させる interlanguage Basic、C、Pascal 形式、FORTRAN、および MASM の間の呼び出しを容易にします。 それ以外の場合は、変換ルーチンは数値を 1 つの言語から別に送信する使用する必要です。
  3. 一貫性を実現するします。 IEEE は、承認済みの業界 C および FORTRAN のコンパイラの標準です。
次に、クイック IEEE と MBF を表す倍精度浮動小数点数値の比較を示します。
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

IEEE と MBF 浮動小数点表現、次の単語を Microsoft Knowledge Base のクエリの違いの詳細については。
   IEEE and floating and point and appnote
				

専用の指数は、広範囲にわたる値の範囲を表すために複数のビットが IEEE メモ。 MBF が複数の仮数ビットでは、その範囲の狭い範囲内でより正確にできます。

一般的な浮動小数点の概念

バイナリ浮動小数点システムできます有限数の正確な形式の浮動小数点値のみを表しているの実現に重要です。 最も近い表現可能な値ではほかのすべての値を approximated する必要があります。 IEEE 標準では、"最も近い表現可能な値に値を丸める方法を指定します。 MS-DOS 用の QuickBasic は、標準サポートし、IEEE 規則に合わせて四捨五入します。

また、IEEE で表される数値は、非常に広い範囲にわたる広げることに注意します。 数の行に想像できます。 高密度 1. 0 および-1.0 に近い表現可能な数は少ない未満とすると 0 または無限大に向けて移動があります。

計算のエンジニアリング向けは IEEE 標準の目標を精度を最大限には (させる、実際にできるだけ近い番号)。 精度で表すことができますの数字の数の場合です。 標準の IEEE の正確さと許容範囲内での精度の両方を保持する、番号の小数部分の使用されるビット数を持つ専用の指数部のビット数のバランスを試みます。

IEEE の詳細

浮動小数点数は、[指数] がバイナリの指数は、次の形式で表されます。
   X =  Fraction * 2^(exponent - bias)
				

[分数] は、小数部、指数が、先頭のビットが常に 1 になるよう調整するための正規化、番号部分の正規化です。 こうすると、それは、格納するしていない精度の 1 つの複数ビットを取得します。 これが、暗黙のビットが理由です。 ことができます考えるこの、科学的表記法と同様に、バイナリ、1 つの桁、小数点の左側に以外が指数を操作するだけの 1 と 0 があるため、最初のビットが 1、ように常に、指数部を操作できます。

[バイアス] は負の指数部を格納する必要がなくなります使用される、バイアス値です。

バイアスを単精度の数値は倍精度浮動小数点数値 (10 進数) 1023年 127 です。

すべての 0 の値と等しいすべて 1 の (バイナリ) は特殊なケースを表すために予約されています. それ以外の特殊な場合も、さまざまなエラー条件を示すがあります。

単精度の例

2 = 1 * 2 ^1 = 0100年 0000 0000 0000... 0000 0000 = 16 進数の 4000 0000
メモ符号のビット 0 でありストアド指数がバイナリで 0000 0 128、または 100 1 を加えた 127 です。 ストアド仮数は (1): 000 0000... 0000 0000、1 とバイナリは、暗黙の先頭を持っているポイント、ので、実際の仮数は 1 です。

-2 = -1 * 2 ^1 = 1100年 0000 0000 0000... 0000 0000 = C000 0000 16 進数
符号のビットが設定されることを除いて + 2 と同じです。 これは、すべての IEEE 形式の浮動小数点数値当てはまります。

4 = 1 * 2 ^2 0100年 0000 = 1000年 0000... 0000 0000 = 4080 0000 16 進数
同じ仮数は、指数部を (バイアスをかけた値はバイナリで 0000 1 51、または 100 ずつ増加します。。

6 = 1. 5 * 2 ^2 = 0100年 0000 1100年 0000... 0000 0000 = 40 C 0 0000 16 進数
同じ指数は、仮数が半分で大きい--方が 100 (1). 0000... 0000 0000、これはバイナリ分数をのでは 1-1/2 (小数部桁数の値が 1/2, 1/4, 1/8 など。)。

1 = 1 * 2 ^0 0011 1111年 = 1000年 0000... 0000 0000 = 3F80 0000 16 進数
その他 2 の累乗として同じ指数、仮数はバイナリで 127、または 011 1111年 1 2 未満の 1 です。

.75 = 1. 5 * 2 ^ -1 = 0011 1111年 0100年 0000... 0000 0000 = 3F40 0000 16 進数
バイアスをかけた指数が 126、011 1111年 0 のバイナリ、仮数は 100 (1). 0000... 0000 0000 は、1-1/2 であります。

2. 5 = 1. 25 * 2 ^1 = 0100年 0000 0010 0000... 0000 0000 = 4020 0000 16 進数
まったく同じ 2 を除く 1/4 を表すビットは設定、仮数されます。

0. 1 = 1. 6 * 2 ^ -4 = 0011 1101年 1100年 1100... 1100年 1101年 = 3DCC CCCD 16 進数
1/10 はバイナリで繰り返し分数です。 仮数は 1. 6 の shy だけであり、バイアスをかけた指数という 1. 6 が 16 で除算されること (011 1101年は 123 10 進数ではバイナリ形式の 1)。 true 指数が 123-127 = - 4 は、2 ** -4 = 1/16 が乗算する係数。 ストアド仮数は、最後のビットで切り上げことを確認します。 これは、unrepresentable の数値をできるだけと正確に表すしようです。 (理由により、その 1/10 と 1 と 100 がまったくないバイナリで表現可能な 1/3 がまったくない 10 進数で表現可能な方法に似ています)。

0 = 1. 0 * 2 ^ -128 = すべてゼロ--特殊なケースです。

その他の一般的な浮動小数点エラー

一般的な浮動小数点エラー次のとおりです。
  1. 丸め-エラー

    このエラーはすべて、2 進数のビットの計算で使用することはできません状況発生します。

    例: 0.9900 に値 (有効桁数を単精度浮動小数点型 (Single) を追加します。

    10 進値としてを表されます。
    (1): 10100011011011100010111 * 2^(-14+Bias) (バイナリで 0 の先頭に 13!)
    0.9900 としてを表されます。
    (1): 11111010111000010100011 * 2^(-1+Bias)
    今すぐこれらの数値を実際に追加する、10 進数 (バイナリ) ポイントする必要があります配置します。 このあります Unnormalized。 結果の追加:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    これは、丸めエラーためにと呼ばれますシフトを追加するときに一部のコンピューターに丸められます。 他のユーザーだけで切り捨てます。 ラウンド - エラー オフが考慮すべき重要たびに、追加または 2 つのまったく異なる値を乗算します。
  2. 値に等しい 2 ほとんど減算
           .1235
          -.1234
           _____
           .0001
    
    						
    このは正規化します。 メモのこと元番号それぞれがある 4 桁は、結果は 1 つだけの大きな数字。
  3. オーバーフローやアンダーフロー

    これは、場合に発生の結果が大きすぎますまたはデータ型で表現できる小さなします。
  4. エラーを quantizing

    これは、浮動小数点の標準で正確な形式で表現できないこれらの番号が発生します。
  5. 非常に小さな数値で除算

    これを「0 除算」エラーをトリガーすることができますまたは次の例として、不正な結果を作成できます:
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    、今すぐ X の MS-DOS 用の QuickBasic が正解、900000 のではなく値 888887、します。
  6. 出力エラー

    出力関数を使用して処理される値を変更するこの種類のエラーの場合されます。

プロパティ

文書番号: 42980 - 最終更新日: 2005年8月16日 - リビジョン: 3.1
この資料は以下の製品について記述したものです。
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 1.0 Standard Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic for MS-DOS
  • Microsoft QuickBasic 4.0
  • Microsoft QuickBASIC 4.0b
  • Microsoft QuickBasic 4.5 for MS-DOS
  • Microsoft BASIC Compiler 6.0
  • Microsoft BASIC Compiler 6.0b
  • Microsoft BASIC Professional Development System 7.0
  • Microsoft Cinemania 97 Standard Edition
キーワード:?
kbmt KB42980 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:42980
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com