算術から算術への変換では、任意の算術データ型を別の算術データ型に代入します。このタイプの変換は、多くの場合、算術演算または比較演算で異なる算術型の作用対象を使用した結果として発生します。すべての場合で、変換先の基数およびスケールは演算子または組み込み関数の変換規則によって指定されますが、変換先の精度は指定されません。
変換先の精度が指定されていない場合は、下の表に示すように、変換元の値のデータ型 (縦列) と変換先の基数およびスケール (横列) から決定されます。
変換先の基数およびスケール、精度 r[,s] | 変換元の基数およびスケール、精度 p[,q] | |||
---|---|---|---|---|
Fixed Binary | Fixed Decimal | Float Binary | Float Decimal | |
Fixed Binary | r = p | r = MIN(CEIL (p*3.32)+1,n) | * | * |
Fixed Decimal | r= MIN(CEIL(p/3.32)+1, n) | r= p | * | * |
Float Binary | s=0 r =MIN(p,n) |
s = q r= MIN (CEIL(p*3.32),n) |
r= p | r=MIN(CEIL(p*3.32),n) |
Float Decimal | r=MIN (CEIL(p/3.32),n) | r=MIN(p,n) | r = MIN (CEIL(p/3.32),n) | r= p |
* | これらの変換は、固定小数点変数への代入時のように、変換先の精度が明示的にわかっている場合にのみ発生します。 | |||
n | 変換先の基数およびスケールについて Open PL/I で許容される最大桁数。精度の制限については、『Open PL/I ユーザー ガイド』を参照してください。 |
小数部を含む固定小数点値から浮動小数点値への変換、またはその逆の変換では、近似値が生成されます。この結果は、変換元の値に最も近い、変換先のスケールおよび精度での数値であり、最後の 2 進数または 10 進数の桁位置で四捨五入して生成されます。
小数部を含む固定小数点値から、小数部を含まないか小数点以下の桁数が少ない固定小数点値への変換では、四捨五入せずに、余分な桁が切り捨てられます。四捨五入は、「Open PL/I Built-ins」の章で説明されているように、ROUND、CEIL、FLOOR、または TRUNC 組み込み関数を使用して実行できます。
変換先の精度が、変換後の値の整数桁をすべて保持できるだけの桁数に対応していない場合、プログラムはエラーになります。このエラーは、Open PL/I では検出されず、PL/I の別の実装では検出される場合と検出されない場合があります。検出された場合は、エラー状態が通知されます。検出されない場合は、予測不可能な結果になります。この検出されないエラーを含み、「正しい」結果を生成するプログラムは、PL/I の別の実装に移すと失敗することがあります。
Fixed Binary の作用対象が (p <= 31) である算術演算では、最大中間精度は p=31 になります。作用対象が (32 >= p <= 63) の場合は、Fixed Binary の最大精度が p=63 である結果精度の規則に従って、結果精度が上がります。符号なしの Fixed Binary の作用対象では、最大中間精度は (p+1) になります。
次の表は、一般的な変換元の値と変換先のデータ型について、上の表に基づく変換先の精度を示しています。実装によっては、変換先の精度がこの表に示されている値よりも小さい値に制限される場合があることに注意してください。
変換元 | 変換先 |
---|---|
Fixed Binary(15) | Fixed Decimal(6,0) |
Fixed Binary(31) | Fixed Decimal(11,0) |
Fixed Binary(63) | Fixed Decimal(19,0) |
Float Binary(21) | Float Decimal(7) |
Float Binary(52) | Float Decimal(16) |
Fixed Decimal(4) | Fixed Binary(15) |
Fixed Decimal(7) | Fixed Binary(25) |
Float Decimal(6) | Float Binary(20) |
Float Decimal(15) | Float Binary(50) |