PowerPC 浮動小数点ハードウェアは、IEEE 単精度 (Fortran プログラムの REAL(4) と同等) か、
または IEEE 倍精度 (Fortran プログラムの REAL(8) と同等) のどちらかで計算を実行します。
常に、次のことに配慮していなければなりません。
- 倍精度は単精度 (範囲は約 10**(-38) から 10**38 で、
その精度は約 7 桁の 10 進数) よりも大きな範囲 (10**(-308) から 10**308) と高い精度 (約 15 桁の 10 進数) を提供します。
- シングルおよびダブルのオペランドを混合した計算は倍精度で実行されるため、
単精度のオペランドを倍精度に変換する必要があります。
その変換がパフォーマンスに影響を与えることはありません。
- 単精度に変換される倍精度値 (SNGL 組み込み関数を指定した場合や、
倍精度の計算結果が単精度変数内に保管される場合など) では、丸め操作が必要です。
丸め操作は、有効な IEEE 丸めモードに基づいて、
正しい単精度の値を作成します。 この値は丸め誤差の結果、元の倍精度の値よりも精度が低くなる場合があります。
倍精度値から単精度値への変換によって、
作成するコードのパフォーマンスが低下することがあります。
- 大量の浮動小数点データを処理するプログラムは、
REAL(8) 変数ではなく REAL(4) 変数を使用した場合に、
実行が早くなることがあります。
(REAL(4) 変数から提供される範囲と精度が許容できるものであることを確認する必要があります。)
プログラムの実行が早くなるのは、データのサイズが小さくなれば、
アプリケーションによってはパフォーマンス上の障害となるメモリー・トラフィックが少なくなるからです。
浮動小数点ハードウェアは、2 つの数を掛けて、その積に 3 番目の数を加算する特殊な一連の倍精度演算も行います。
これらの組み合わせ乗加算 (MAF) 演算は、
乗算または加算演算が単独で実行される場合と同じ速度で実行されます。
MAF 機能は、1 回 (2 回ではない) の丸め誤差で乗算および加算を実行するので、
IEEE 標準に拡張機能を提供します。
MAF 機能を使用すると、同等の別々の演算よりも速く、また精度も高くなります。
XL Fortran 拡張精度は、IEEE 標準で提唱されている形式になっていません。IEEE 標準は、
(さらに範囲を大きくするため) 指数部のビットと (さらに精度を高めるため) 小数部のビットの両方を拡張する形式を提唱しています。
Fortran プログラムにおける REAL(16) と同等の XL Fortran 拡張精度がソフトウェアに組み込まれています。
拡張精度は、倍精度と同じ範囲 (約 10**(-308) から 10**308) を提供しますが、
精度は倍精度よりも高くなります (可変で、約 31 桁の 10 進数またはそれ以上)。
ソフトウェアのサポートは、最も近い値への丸めモードだけに限定されています。
拡張精度を使用するプログラムは、拡張精度計算の実行時にこの丸めモードが必ず有効になるようにする必要があります。
丸めモードを制御するさまざまな方法については、
丸めモードの選択を参照してください。
拡張精度の値を 16 進数、8 進数、2 進数、ホレリス定数として指定しているプログラムは、
次の規則に従っている必要があります。
- 拡張精度の数字は、異なる絶対値を持ち、
オーバーラップしない 2 つの倍精度の数字から構成されています。
つまり、バイナリーの指数は、最低でも REAL(8) における小数部のビットの数だけ異なっています。
高位倍精度値 (ストレージに入れられる最初の値) は、
それよりも大きな絶対値を持っている必要があります。
拡張精度の数値は、その 2 つの倍精度値の合計です。
- NaN または無限大の値の場合は、これらの値のうちの 1 つを高位倍精度値内でエンコードする必要があります。
下位値は無効です。
XL Fortran 拡張精度値は 小数部に多数の想定ゼロを保持した大幅に異なる指数を持つ 2 つの値の和で、この形式は実際には可変精度を持つことになります。
(最小値は約 31 桁の 10 進数です。)
2 つの倍精度値の指数の絶対値が倍精度値の桁数よりも大きく異なっている場合は、
精度はさらに高くなります。
このエンコードを行うことにより、倍精度固有の範囲を超えずに、
見かけ上倍精度より高い精度を必要とするアプリケーションを想定した処理系が効率よく実現できます。
注:
- 式のコンパイル時フォールディングが原因の丸め誤差に関しては、
このフォールディングによって、
異なった結果が作成される頻度が他の精度の場合よりも拡張精度値の場合のほうが多いということを念頭に置いておいてください。
- NaN および無限大などの特殊な数字は、拡張精度値に対して完全にはサポートされていません。
算術演算は、これらの数字を必ずしも拡張精度で伝搬するとは限りません。
- 拡張精度値の場合、XL Fortran で常に浮動小数点演算例外条件が検出されるわけではありません
(浮動小数点演算例外の検出とトラッピングを参照)。
また、拡張精度を使用するプログラムで浮動小数点演算例外のトラッピングをオンにすると、
例外条件が実際には発生していない場合でも、シグナルが生成されることがあります。
