10 進浮動小数点組み込み関数

10 進浮動小数点組み込み関数は、各 DFP ハードウェア命令に 提供されます。 XL C/C++ 開発者は、適切なパラメーターで関数を 呼び出すことで、10 進浮動小数点組み込み関数とマクロ、または 名前付き定数を使用できます。 10 進浮動小数点組み込み関数の使用には、 ヘッダー・ファイルをインクルードする必要はありません。 それらは、DFP が有効になると自動的にコンパイラーによって定義されます。

すべての 10 進浮動小数点組み込み関数が、最低でも ARCH(7) の ハードウェア・レベルを必要とします。

表 1 で注記しているとおり、単精度のサポートは制限されています。

表 1. IEEE 操作用 10 進浮動小数点命令のプロトタイプ
プロトタイプおよび注 説明
_Decimal32   __d32_abs (_Decimal32); 
_Decimal64   __d64_abs (_Decimal64); 
_Decimal128   __d128_abs (_Decimal128); 
これらの関数は、パラメーターの絶対値を返します。
_Decimal32   __d32_copysign
 (_Decimal32 exponent_and_fraction, _Decimal32 sign);
  
_Decimal64   __d64_copysign 
(_Decimal64 exponent_and_fraction, _Decimal64 sign); 

_Decimal128   __d128_copysign
 (_Decimal128 exponent_and_fraction, _Decimal128 sign); 
これらの関数は、第 1 パラメーターの絶対値に 第 2 パラメーターの符号を付けて返します。
_Decimal32   __d32_sNaN (void); 
_Decimal64   __d64_sNaN (void); 
_Decimal128   __d128_sNaN (void); 

_Decimal32   __d32_qNaN (void); 
_Decimal64   __d64_qNaN (void); 
_Decimal128   __d128_qNaN (void); 
これらの関数は、指定された精度の静止 NaN または シグナリング NaN を、正の符号付きでペイロードはゼロで作成します。
_Decimal64   __d64_integral (_Decimal64);
_Decimal128   __d128_integral (_Decimal128);
_Decimal64   __d64_integral_no_inexact (_Decimal64);
_Decimal128   __d128_integral_no_inexact (_Decimal128); 

関数 __d64_integral__d128_integral では、inexact 例外が 許可されます。 命令 M4 ビット 21 は 0 に設定されます。

関数 __d64_integral_no_inexact__d128_integral_no_inexact は、inexact 例外があってもそれを抑止します。 命令 M4 ビット 21 は 1 に設定されます。

これらすべての関数が、命令 M4 ビット 20 を 0 に設定にします。入力がシグナリング NaN の場合は、静止 NaN に変換されます。

これらの関数は、10 進浮動小数点値を 10 進浮動小数点形式の 整数値に丸めます。小数点以下の桁は 破棄されます。 現在の丸めモードが使用されます。
_Decimal64   __d64_quantize
 (_Decimal64, _Decimal64, long round_mode); 

_Decimal128   __d128_quantize
 (_Decimal128, _Decimal128, long round_mode); 
round_mode パラメーターは、コンパイル時、定数式で なければなりません。 次のいずれかを使用できます。
これらの関数は、第 1 パラメーターの演算値を、 第 2 パラメーターに合うよう指数を調整して返します。 そこでは、現在の丸めモードを 一時的に無効にして、指定した丸めモードを使用することができます。
bool   __d64_same_quantum (_Decimal64, _Decimal64); 
bool   __d128_same_quantum (_Decimal128, _Decimal128); 
これらの関数は、2 つのパラメーターの指数を 比較します。 指数が同じ場合、関数は「真」を返します。
long   __d64_compare_signaling (_Decimal64, _Decimal64); 
long   __d128_compare_signaling (_Decimal128, _Decimal128); 

これらの関数は、通常、関係を表す <0、==0、または >0 を返します。 いずれかの値が NaN の場合は、"-2" (順序なし) を返します。

これらの関数は、2 つの 10 進浮動小数点値を 比較します。 標準的な等価または関係演算子を使用する比較と異なり、 これらの関数では、いずれかのオペランドが静止 NaN またはシグナリング NaN である場合、 無効演算例外も発生します。

long long   __d64_to_long_long (_Decimal64); 
long long   __d128_to_long_long (_Decimal128); 

long long   __d64_to_long_long_rounding (_Decimal64, long round_mode); 
long long   __d128_to_long_long_rounding (_Decimal128, long round_mode); 

キャストは常にゼロに向かって丸めを行いますが、 関数 __d64_to_long_long ( ) および __d128_to_long_long ( ) は、 現在の 10 進の丸めモードを使用します。

関数 __d64_to_long_long_rounding ( )__d128_to_long_long_rounding ( ) では、現在の丸めモードを 一時的に無効にして、指定した丸めモードを使用することができます。

round_mode パラメーターは、コンパイル時、定数式で なければなりません。 次のいずれかを使用できます。
これらの関数は、10 進浮動小数点値を、丸めモード・オプションを 使用して 64 ビットの符号付き 2 進整数に変換します。

unsigned long __dfp_get_round_mode (void);

この関数は、z/Architecture® FPC レジスターから、現在の 10 進丸めモードを 取得します。

void __dfp_set_round_mode (unsigned long round_mode);

関数内で丸めモードを変更する場合は、関数から戻る前に 元のモードを復元する必要があります。
この関数は、指定された 10 進丸めモードを z/Architecture FPC レジスターに 設定して、そのモードを現行モードにします。
表 2. IEEE . . .is 操作用 10 進浮動小数点命令のプロトタイプ
プロトタイプおよび注 説明
bool __d32_isfinite (_Decimal32); 
bool __d64_isfinite (_Decimal64); 
bool __d128_isfinite (_Decimal128); 
これらの関数は、パラメーターが正または負の無限大でなく、 かつ NaN でもない場合に「真」を返します。
bool __d32_isinf (_Decimal32); 
bool __d64_isinf (_Decimal64); 
bool __d128_isinf (_Decimal128);
これらの関数は、パラメーターが正または負の無限大の場合に 「真」を返します。
bool __d32_isnormal (_Decimal32);  
bool __d64_isnormal (_Decimal64); 
bool __d128_isnormal (_Decimal128); 
これらの関数は、パラメーターがサブノーマル、無限大、または NaN でなく、 正常範囲内である場合に「真」を返します。
bool __d32_issignaling (_Decimal32); 
bool __d64_issignaling (_Decimal64); 
bool __d128_issignaling (_Decimal128); 
これらの関数は、パラメーターが正または負のシグナリング NaN の場合に 「真」を返します。
bool __d32_issigned (_Decimal32);
bool __d64_issigned (_Decimal64); 
bool __d128_issigned (_Decimal128); 
これらの命令は、パラメーターが負 (負のゼロ、負の無限大、負の NaN を含む) である場合に 「真」を返します。
bool __d32_issubnormal (_Decimal32);
bool __d64_issubnormal (_Decimal64); 
bool __d128_issubnormal (_Decimal128); 
これらの関数は、パラメーターがサブノーマルの場合に 「真」を返します。
bool __d32_iszero (_Decimal32);
bool __d64_iszero (_Decimal64); 
bool __d128_iszero (_Decimal128); 
これらの関数は、パラメーターが正または負のゼロの場合に 「真」を返します。
表 3. IBM 命令用 10 進浮動小数点命令のプロトタイプ
プロトタイプおよび注 説明
_Decimal32   __d32_nabs (_Decimal32);
_Decimal64   __d64_nabs (_Decimal64); 
_Decimal128   __d128_nabs (_Decimal128); 
これらの関数は、パラメーターの負の絶対値を返します。
long long   __d32_to_gpr (_Decimal32); 
long long   __d64_to_gpr (_Decimal64); 
void   __d128_to_gprs (_Decimal128, long long *upper, long long *lower); 
注: GPR から値を転送する関数も参照してください。
これらの関数は、FPR または FPR のペアの値を、GPR、GPR のペア、 または 4 つの GPR に転送します。
_Decimal32   __gpr_to_d32 (long long);  
_Decimal64   __gpr_to_d64 (long long);  
_Decimal128   __gprs_to_d128 (long long upper, long long lower); 
注: 値を GPR に転送する関数も参照してください。
これらの関数は、GPR、GPR のペア、または 4 つの GPR の値を、FPR または FPR のペアに 転送します。
_Decimal32   __d64_round_to_d32
 (_Decimal64, unsigned long round_mode, bool suppress_invalid); 

_Decimal64   __d128_round_to_d64
 (_Decimal128, unsigned long round_mode, bool suppress_invalid);
round_mode パラメーターは、コンパイル時、定数式で なければなりません。 次のいずれかを使用できます。
入力値がシグナリング NaN の場合に、
  • suppress_invalid が偽だと、結果は静止 NaN になり、 無効演算例外が発生します。
  • suppress_invalid が真だと、結果はシグナリング NaN になり、 例外は発生しません。
これらの関数は、丸めの制御と、キャストでは使用できない無効例外の制御を使用して、 より狭い形式に値を変換します。
long long   __d64_to_signed_BCD (_Decimal64, bool CF); 

void   __d128_to_signed_BCD (_Decimal128, bool CorF,
                           unsigned long long *upper,
                           unsigned long long *lower); 

__d64_to_signed_BCD は、15 桁の 10 進数字とそれに続く 10 進符号を 64 ビットの結果に 作成します。

__d128_to_signed_BCD は、31 桁の 10 進数字と それに続く 10 進符号を 128 ビットの結果に作成します。

負の値には、符号 0xD が設定されます。

CorF が偽の場合、正の値には、 符号 0xC が設定されます。

CorF が真の場合、正の値には、 符号 0xF が設定されます。

これらの関数は、パラメーターの下位の桁を 符号付きパック形式に変換します。
_Decimal64   __signed_BCD_to_d64 (signed long long); 

_Decimal128   __signed_BCD_to_d128 (signed long long upper,
                                    signed long long lower); 

符号の 0xA0xC0xE、および 0xF は、 正の符号と見なされ、0xB0xD は、負と見なされます。

__signed_BCD_to_d64 は、15 桁の 10 進数字とそれに続く 10 進符号を 64 ビットの入力に変換します。

__signed_BCD_to_d128 は、31 桁の 10 進数字と それに続く 10 進符号を 128 ビットの入力に変換します。

これらの関数は、符号付きパック 10 進を 10 進浮動小数点に 変換します。
_Decimal64   __unsigned_BCD_to_d64 (unsigned long long); 
_Decimal128   __unsigned_BCD_to_d128 (unsigned long long upper,
                                      unsigned long long lower); 

__unsigned_BCD_to_d64 は、符号を持たない 16 桁の 10 進数字を 64 ビットの入力に変換します。

__unsigned_BCD_to_d128 は、符号を持たない 32 桁の 10 進数字を 128 ビットの入力に変換します。

これらの関数は、パラメーターの下位の桁を 符号なしパック形式に変換します。
_Decimal64   __d64_reround
 (_Decimal64, unsigned long number_of_digits, unsigned long round_mode); 

_Decimal128   __d128_reround
 (_Decimal128, unsigned long number_of_digits, unsigned long round_mode); 
round_mode パラメーターは、コンパイル時、定数式で なければなりません。 次のいずれかを使用できます。
これらの関数は、値を丸めて桁数を減らします。 そこでは、現在の丸めモードを一時的に無効にできます。 正しい丸めを行うには、入力値の計算に以下を使用する必要があります。

ROUND_TO_PREPARE_FOR
_SHORTER_PRECISION

詳しくは、FPC レジスターの丸めマクロをサポートする定義を参照してください。
_Decimal64   __d64_insert_biased_exponent
 (_Decimal64, long biased_exponent); 

_Decimal128   __d128_insert_biased_exponent
 (_Decimal128, long biased_exponent); 
注 :
  1. 指定されたパラメーターの指数を返す関数も参照してください。
  2. 無限大、静止 NaN、またはシグナリング NaN の型定義については、バイアス指数の定義を参照してください。
これらの関数は、第 1 パラメーターの数字と符号に、 第 2 パラメーターのバイアス指数を付けて、無限大、静止 NaN、または シグナリング NaN の特殊値と一緒に返します。
_Decimal64   __d64_shift_left
 (_Decimal64, unsigned long number_of_digits); 

_Decimal128   __d128_shift_left
 (_Decimal128, unsigned long number_of_digits); 
これらの関数は、左側に係数シフトされた パラメーターを返します。 符号と指数は変更されません。 シフト・カウントの範囲は 0 から 63 です。それ以外の場合、結果は未定義です。
_Decimal64   __d64_shift_right
 (_Decimal64, unsigned long number_of_digits); 

_Decimal128   __d128_shift_right
 (_Decimal128, unsigned long number_of_digits); 
これらの関数は、右側に係数シフトされた パラメーターを返します。 符号と指数は変更されません。 シフト・カウントの範囲は 0 から 63 です。それ以外の場合、結果は未定義です。
long   __d32_test_data_class
 (_Decimal32, unsigned long data_class_mask); 

long   __d64_test_data_class
 (_Decimal64, unsigned long data_class_mask); 

long   __d128_test_data_class
 (_Decimal128, unsigned long data_class_mask); 
これらの関数の機能は以下のとおりです。
  • 指数のタイプ (ゼロ、サブノーマル、通常、無限大、静止 NaN、 またはシグナリング NaN) と値の符号を判定します。
  • 指数がマスク指定に一致するかどうかを示す 長整数を返します。 一致する場合、関数は "1" を返します。 一致しない場合は、"0" を返します。
    注: マスクは、コンパイル時、定数式でなければなりません。 テスト・データ・クラス・マスクを参照してください。
テスト・データ・グループ関数も参照してください。
これらの関数は、パラメーターの指数と符号を検査して、 パラメーターが、定義済みデータ・クラス内またはデータ・クラスのセットに あるかどうかを判定します。
long   __d32_test_data_group
 (_Decimal32, unsigned long data_group_mask); 

long   __d64_test_data_group
 (_Decimal64, unsigned long data_group_mask); 

long   __d128_test_data_group
 (_Decimal128, unsigned long data_group_mask);  
これらの関数の機能は以下のとおりです。
  • 指数タイプ (セーフ・ゼロ、サブノーマル、先行ゼロがない通常のタイプ、または無限大か NaN) と、 パラメーターの符号および先頭の桁を判定します。
    注 :
    1. 「セーフ・ゼロ」には先行ゼロの桁と非エクストリーム指数があります。
    2. 「サブノーマル」は、エクストリーム非ゼロまたはセーフ非ゼロとして 表すこともできます。
  • 指数がマスク指定に一致するかどうかを示す 長整数を返します。 一致する場合、関数は "1" を返します。 一致しない場合は、"0" を返します。
    注: マスクは、コンパイル時、定数式でなければなりません。 これらのマスクを定義するステートメントについては、テスト・データ・グループ・マスクを参照してください。
テスト・データ・クラス関数も参照してください。
これらの関数は、パラメーターの指数、符号、および最初の桁を検査して、 パラメーターが、定義済みデータ・グループ内またはデータ・グループのセットに あるかどうかを判定します。
long   __d64_biased_exponent (_Decimal64); 
long   __d128_biased_exponent (_Decimal128); 
これらの関数は、パラメーターの指数を 整数で返します。
unsigned long long   __d64_to_unsigned_BCD (_Decimal64); 

void   __d128_to_unsigned_BCD (_Decimal128, 
                               bool CorF,
                               unsigned long long *upper,
                               unsigned long long *lower); 

正の値には、CorF が偽の場合は、符号 0xC が設定されます。 真の場合には 0xF が設定されます。 負の値には、符号 0xD が設定されます。

__d64_to_unsigned_BCD は、符号を持たない 16 桁の 10 進数字を 64 ビットの結果に作成します。

__d128_to_unsigned_BCD は、符号を持たない 32 桁の 10 進数字を 128 ビットの結果に作成します。
注: それより左側の桁は、すべて無視されます。 無視された桁にアクセスするには、 適切な __d#_shift_right 関数を使用してください。
これらの関数は、パラメーターの下位の桁を 符号なしパック形式に変換します。
long   __d64_compare_exponents (_Decimal64, _Decimal64); 
long   __d128_compare_exponents (_Decimal128, _Decimal128); 

両方の指数が有限の場合、これらの関数は、指数間の関係を表す "<0""==0" または ">0" を返します。

両方の指数が無限の場合は、"0" を返します。

片方の指数が無限で、もう一方が有限の場合は、"-2" (順序なし) を返します。

これらの関数は、指数を相互に比較します。
long   __d64_extract_significance (_Decimal64);  
long   __d128_extract_significance (_Decimal128); 
これらの関数は、通常、入力値の有効数字の数を返します。
例外:
  • 入力がゼロの場合、戻り値は "0" です。
  • 入力が無限大の場合、戻り値は "-1" です。
  • 入力が静止 NaN の場合、戻り値は "-2" です。
  • 入力がシグナリング NaN の場合、戻り値は "-3" です。
 void   __SFASR (unsigned long); 
この関数は、浮動小数点制御 (FCP) レジスターを変更するため、 例外を出す場合があります。
IBM® zEnterprise® EC12 は、10 進浮動小数点とゾーン・タイプ間の変換用のハードウェア命令を備えています。DFP および ARCH(10) の両方のコンパイラー・オプションが有効な場合、以下のハードウェア組み込み関数が使用可能です。
表 4. 10 進浮動小数点とゾーン・タイプ間の変換用の命令プロトタイプ
プロトタイプおよび注 説明
_Decimal64 __cdzt(void* source, 
                  unsigned char length, 
                  const unsigned char mask);

_Decimal128 __cxzt(void* source, 
                   unsigned char length, 
                   const unsigned char mask);

source は、有効なゾーン・フォーマットのデータが入っているメモリー位置を指します。

length は、マシン・インストラクションにエンコードされるソース・フィールドの長さを指定します。length の値の範囲には、__cdzt の場合は 「0-15」__cxzt の場合は 「0-33」を指定できます。length の値がリテラルでない場合、EX 命令が生成され、ターゲット CDZT または CXZT 命令が実行されます。

mask の値は、マシン・インストラクションにエンコードされる M3 の値を提供します。mask の値はリテラルとして指定する必要があります。

戻り値は、変換された 10 進浮動小数点値です。

これらの関数は、ゾーン・タイプを 10 進浮動小数点タイプに変換します。
int __czdt(_Decimal64 source, 
           void* result, 
           unsigned char length, 
           const unsigned char mask);

int __czxt(_Decimal128 source, 
           void* result, 
           unsigned char length, 
           const unsigned char mask);

source には、変換される 10 進浮動小数点が含まれています。

result は、ゾーン・フォーマットの変換済みデータを受け取るメモリー位置を指します。

length は、変換する 10 進浮動小数点値の右端の桁の数を指定します。length の値は、マシン・インストラクションにエンコードされる結果フィールドの長さをバイト単位で指定します。length の値の範囲には、__czdt の場合は「0-15」__czxt の場合は「0-33」を指定できます。length の値がリテラルでない場合、EX 命令が生成され、ターゲット CZDT または CZXT 命令が実行されます。

mask の値は、マシン・インストラクションにエンコードされる M3 の値を提供します。mask の値はリテラルとして指定する必要があります。

戻り値は、命令で設定される条件コードです。

これらの関数は、10 進浮動小数点タイプをゾーン・タイプに変換します。