本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX フローティング・ポイント ガイド: HP 9000 コンピュータ > 第2章 浮動小数点の原理および 2 進浮動小数点演算についての IEEE 規格

浮動小数点演算

≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 用語集

 ≫ 索引

IEEE 規格では、次の浮動小数点演算をサポートすることをシステムの準拠要件としています。

加算 

代数加算

減算 

代数減算

乗算 

代数乗算

除算 

代数除算

比較 

任意の 2 つの浮動小数点数値の間には、より小さい、等しい、より大きい、および無順位の 4 通りの関係が可能です。無順位関係は、オペランドの一方または両方が非数 (NaN) である場合に発生します。詳細は、「比較」の項を参照してください。

平方根 

平方根演算は、オーバーフローまたはアンダーフローを起すことはありません。

変換 

単精度形式、倍精度形式、および 4 倍精度形式をサポートする実装方式の場合、次の変換をサポートしなければなりません。

  • 単精度から倍精度

  • 単精度から 4 倍精度

  • 倍精度から単精度

  • 倍精度から 4 倍精度

  • 4 倍精度から単精度

  • 4 倍精度から倍精度

  • 浮動小数点から整数

  • 整数から浮動小数点

  • 2 進数浮動小数点から 10 進数字列

  • 10 進数字列から 2 進数浮動小数点

これらの変換についての詳細は、「オペランド形式間の変換」の項を参照してください。

最も近い整数値への丸め 

引き数を現在の丸めモードに基づいて (浮動小数点形式で) 最も近い整数値に丸めます。丸めモードについては、「不正確な結果 (丸め)」の項で説明しています。

剰余 

剰余演算は、xy の 2 つの引き数を使用して、x - y * n と定義されます。ここでn は、x/y 値に最も近い整数となります。詳細は、「剰余演算」の項を参照してください。

各演算の特性を理解するには、非正規化数、無限大、および NaN を理解する必要があります (「正規化数と非正規化数」の項、「無限大」の項、および「NaN (非数)」の項を参照)。HP 9000 は、前述のすべての演算について、IEEE 規格に準拠しています。

規格では、各演算の結果が、丸めモードに従って数学的に誤差のない値から IEEE 表現に丸められることを要件としています。最も近い値への丸めモード (デフォルト) では、演算結果は、1/2ULP 以内になります (この規則には 1 つの例外があります。2 進数と 10 進数字列間の変換では、その範囲の限界では丸めが正確に行われる必要はありません)。

比較

比較演算は、2 つの浮動小数点数値の関係が真であるかどうかを決定します。4 つの基本比較は、次の通りです。

オペランド 1 < オペランド 2
  

第 1 オペランドが第 2 オペランドよりも小さい。

オペランド 1 = オペランド 2
  

第 1 オペランドと第 2 オペランドが等しい。

オペランド 1 > オペランド 2
  

第 1 オペランドが第 2 オペランドよりも大きい。

オペランド 1 ? オペランド 2
  

無順位です。この比較は、どちらか一方のオペランドが NaN の場合に真となります。

基本比較は、相互に組み合わせることができます。例えば、"a >= b"は、ab と等しいか、小さいかを示します。同様に、"a <> b"は、ab より大きいか、または小さいかのどちらか一方であることを示します。NaN でないオペランドの場合、"a = b"の逆となります。

注記: 比較演算子を実際のプログラミング言語の演算子と混同しないようにしてください。例えば、プログラミング言語では、? 演算子をサポートしていません。

リリース 11.0 において、C 数学ライブラリは、例外を発生することなく比較演算を実装するisgreater, isgreaterequal, isless, islessequal, islessgreater, およびunordered の 6 つの新規マクロを提供しています。詳細は、「C9X 関数とマクロ」の項を参照してください。

比較は、否定の形式でも表現できます。

IEEE 規格では、各可能な比較に対して、認識非認識という 2 つのバージョンを定義しています。比較の認識および非認識の両バージョンとも、他のすべての NaN およびそれ自身も含めて、いかなる数値とも大小関係で比較されず、いかなる値とも等しくない特殊な値として NaN を取り扱います。この定義は、x が NaN である場合に、"x = x"が FALSE に評価されるという興味深い結果をもたらします。実際に、アプリケーションでは、特に NaN を検出するためにこの比較演算を使用することがありますが、ベンダのオプティマイザーの中には、この演算をコード中から削除するものもあるので、危険な方法になります。

比較の非認識バージョンは、認識バージョンと同じように動作するだけでなく、少なくとも一方のオペランドが NaN の場合、<、<=、>、および >= を使用した比較に対して無効演算例外も引き起こされます。=、!=、および? の比較だけが、NaN オペランドに対して有効になります。

シグナル NaN は、認識および非認識の両比較に対して無効演算を引き起します。

考えられる各種のオペランド対する比較演算の動作は、次の通りです。

正規化数と非正規化数 

オペランドは、代数的に比較されます。

ゼロ 

ゼロは、任意のゼロでない負の値より大きく、任意のゼロでない正の値より小さいものです。ゼロの符号は無視されるので、符号が反対の場合でもゼロ同士の比較では常に等しくなります。

無限大 

比較演算子にとって、無限大は、その大きさが正規化数の最大値の大きさよりも大きい、符号の付いた数値です。符号が同じ無限大は、比較すると等しくなります。

NaN 

NaN は、他の NaN およびそれ自身を初めとするすべてのオペランドと比較しても等しくなりません。前述の規則を使用して、NaN を含む比較を TRUE または FASLE として評価します。比較が非認識バージョンであり、<、<=、>、または >= を含む比較の場合、無効演算例外に対してもシグナルを送ります。

オペランド形式間の変換

規格では、10 進数字列と 2 進数浮動小数点間の変換、および 2 進数浮動小数点形式と整数形式間の変換が可能であることを要件とします。ここでは、さまざまな変換の特性の一部を説明します。整数型オペランドは、符号付き整数または符号なし整数のいずれかです。

単精度から倍精度または 4 倍精度
  

これらの変換では、オーバーフロー、アンダーフロー、または不正確な結果になることはありません。唯一の例外は、オペランドが SNaN の場合の無効演算に限られます。

倍精度から 4 倍精度 

これらの変換では、オーバーフロー、アンダーフロー、または不正確な結果になることはありません。唯一の例外は、オペランドが SNaN の場合の無効演算に限られます。

4 倍精度または倍精度から単精度 

これらの変換では、オーバーフローまたはアンダーフローが起る可能性があり、通常不正確な結果になります。

4 倍精度から倍精度 

これらの変換では、オーバーフローまたはアンダーフローが起る可能性があり、通常不正確な結果になります。

10 進数から単精度、倍精度、または 4 倍精度
  

これらの変換では、オーバーフローまたはアンダーフローが起る可能性があり、通常不正確な結果になります。これらの変換についての詳細は、「2 進/10 進変換」の項を参照してください。

単精度、倍精度、または 4 倍精度から 10 進数
  

これらの変換では、オーバーフローまたはアンダーフローが起る可能性があり、通常不正確な結果になります。これらの変換についての詳細は、「2 進/10 進変換」の項を参照してください。

単精度、倍精度、または 4 倍精度から整数
  

これらの変換では、通常不正確な結果になります。範囲外有限値、無限大、および NaN によって、無効演算例外が発生します。オーバーフローおよびアンダーフローは、これらの変換には適用されません。1 に丸めるには小さすぎる結果は、ゼロに丸められます。符号付きゼロは、整数のゼロとなります。

HP 9000 システムは、IEEE 丸め規則に従って、変換の丸めを行います。ただし、プログラミング言語の中には C などのように、これらの変換を切り捨てによって行うことを要求するものもあります。浮動小数点数値の整数への切り捨て時に起り得る問題については、「整数値への切り捨て」の項を参照してください。

整数から 4 倍精度 

この変換は常に正確に行われ、例外を起すことはありません。

整数から倍精度または単精度 

これらの変換では、不正確な結果例外を生成する 224 - 1 より大きい 32 ビットの整数値から単精度への変換および 253 - 1 より大きい 64 ビットの整数値から倍精度への変換を除いて、誤差は発生しません。

剰余演算

剰余演算は、誤差のない剰余機能です。ゼロでないy に対して、剰余r = remainder(x, y) は、次のように定義されます。

   r = x - y * n 

ここでn は、x/y の正確な値に最も近い整数です。|n - x/y| = 1/2 の場合、n は偶数となります。r がゼロの場合、その符号はx の符号と同じになります。

次に例を 2 つ挙げます。

  • 1.6/2.0 の結果に最も近い整数は 1 です。従って、1.6 と 2.0 の剰余は、1.6 - (2.0 * 1)、すなわち-0.4 となります。

  • 5.0/2.0 の結果に最も近い整数は 2 です (正しい結果は、2 と 3 の中間値になるので、n は偶数になります)。5.0 と 2.0 の剰余は、5.0 - (2.0 * 2)、すなわち 1 となります。

剰余演算の結果は、丸めモードの影響を受けません (結果は常に正確であり、丸めは演算結果に関係しません)。

C 数学ライブラリのremainder 関数は、IEEE の剰余演算を実装したものです。

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© Hewlett-Packard Development Company, L.P.