第12章Caché関数コレクション$ DECIMAL関数
Caché浮動小数点値に変換された数値を返します。
概要
$DECIMAL(num,digits)
パラメータ
- num変換する数値。通常、これはIEEE浮動小数点数です。
- digitsオプション-返される有効桁数を指定する整数。
$DECIMAL
IEEE浮動小数点丸めアルゴリズムを使用して、戻り値をこの桁数に丸めます。有効な値は、1から38、および0です。桁数が桁数より大きい場合、値は変更されません。桁数が0の場合、有効桁数が20桁を超えない限り、numは丸められません。
解説
$DECIMA
Lは、Caché10進浮動小数点データ型に変換された浮動小数点数を返します。この関数は、IEEE倍精度(64ビット)2進浮動小数点形式の10進数を、Caché10進浮動小数点形式の対応する10進数に変換するために使用されます。これは、$DOUBLE
関数が実行するものの逆です。
CachéSQLデータ型DOUBLEおよびDOUBLE PRECISIONはIEEE浮動小数点数を表し、FLOATデータ型は標準のCaché10進数を表します。
IEEE浮動小数点数は、53のバイナリビットを内部的に使用します。ほとんどの小さな10進数には正確な2進数表現がないため、$DOUBLE
通常、10進数の形式は$DECIMAL
変換とわずかに異なります。サポートされているすべてのCachéシステムプラットフォームで、標準のCaché小数部の精度は、約18.96桁です。IEEE浮動小数点数が10進数として表示される場合、通常、2進数は18桁を大幅に超える10進数に変換されます。これは、IEEE浮動小数点数が標準のCaché10進数よりも正確であることを意味しません。
num値は、数値または数値の文字列として指定できます。$DECIMAL
変換前に、正規の形式に解析されます(先頭のゼロと末尾のゼロが削除され、複数の符号が解決されるなど)。値がnumを超える場合、FLOATデータ型は値の範囲に変換できる$DECIMAL
ため<MAXNUMBER>
、エラーが生成されます。numに数値以外の文字列を指定すると、0が返されます。numに混合数値文字列(“7dwarves”
またはなど“ 7.5.4”
)を指定すると、最初の非数値文字の入力値が切り捨てられ、数値部分が変換されます。
デフォルトの丸めは次のとおりです。
$DECIMAL
小数部:数値が指定されておらず、numの有効桁数が19桁を超える場合、小数部は丸められ、結果として得られる19桁の数になります(その後にゼロに丸めると、より小さいと比較されます)。$DECIMAL
絶対値が大きい方の小数に常に四捨五入します。- 非常に大きな整数:数値が指定されておらず、小数点の左側に19桁以上の有効な整数
$DECIMAL
が丸められているため、結果の整数は19桁の有効数字と残りの整数はゼロになります。 - 1未満の非常に小さい小数:数字が指定されておらず、numが有効値の前の小数点であり、小数点の右側に19桁の小数があり、右側に19桁以上の小数がある
$DECIMAL
場合、ゼロは保持され、有効桁の小数部は四捨五入されます。 。小数は有効数字19桁に丸められます。 - 非常に小さい小数の整数:数値が指定されておらず、numが数値である場合、数値にはゼロ以外の整数部分が含まれます。有効値の前の小数点の右側に19個以上のゼロがあり
$DECIMAL
、整数に丸められます。
digitsパラメータを使用して、戻り値を指定した桁数に丸めることができます。末尾のゼロは常に削除されます。数値が正の整数の場合、丸めにはIEEE丸め規格が使用されます。有効数字(38 =およびデジタル)が38を超える場合$DECIMAL
、小数部分は38桁に切り上げられ、以降のすべての数字はゼロになります。数が38より大きい場合、<ILLEGAL VALUE>
エラーが生成されます。
数字が0の場合、数値は強制的に文字列照合に変換され、それ以外の場合は0になります。(に相当し+ num)_“”
ます。numが20桁未満の場合、digits = 0はdigits = 20と同じです。
ただし、数値が0でnumが20より大きい場合、以下に示すように、IEEEの丸めではなく特別な丸めが実行されます。20桁を返すように四捨五入します。20桁目が0または5に丸められる場合、20桁目は特別に丸められます。20位が0または5に丸められる場合、Cachéはそれをそれぞれ9または4に丸めます。20桁目が0または5に切り捨てられる場合、Cachéはそれをそれぞれ1または6に切り上げます。他の20個のデジタル値は変更されません。丸めアルゴリズムは、数値の正しい順序付けルールを提供し、丸めの不整合を回避するために使用されます。
整数除算
一部の値では、Cachéの10進浮動小数点数とIEEE倍精度数により、異なる整数除算積が生成されます。例えば:
DHC-APP>WRITE !,"Cache \: ",$DECIMAL(4.1)\.01
Cache \: 410
DHC-APP>WRITE !,"Double \: ",$DOUBLE(4.1)\.01
Double \: 409
INF 与 NAN
numがのINF
場合、<MAXNUMBER>
エラーが生成されます。numがの場合、エラーNAN
が生成さ<ILLEGAL VALUE>
れます。これらの無効な値は、次の例に示されています。
DHC-APP>SET i=$DOUBLE("INF")
DHC-APP>SET n=$DOUBLE("NAN")
DHC-APP>WRITE $DECIMAL(i)
WRITE $DECIMAL(i)
^
<MAXNUMBER>
DHC-APP>WRITE $DECIMAL(n)
WRITE $DECIMAL(n)
^
<ILLEGAL VALUE>
例
以下の例は$DECIMAL
、Caché形式の10進数に適用すると無効であることを示しています。
/// d ##class(PHA.TEST.Function).decimal()
ClassMethod decimal()
{
SET x=$DECIMAL($ZPI)
SET y=$ZPI
IF x=y {
WRITE !,"相同:"
WRITE !,"Cache $DECIMAL: ",x
WRITE !,"Native Cache: ",y
} ELSE {
WRITE !,"不同:"
WRITE !,"Cache $DECIMAL: ",x
WRITE !,"Native Cache: ",y
}
}
以下の例は、piの$DOUBLE
値を値および標準のCaché値として返します。この例は、$DOUBLE
標準のCaché番号間で同等性を試みてはならず、以下を$DECIMAL
使用してIEEEをCachéに変換しても同等性を復元できないことを示しています。
/// d ##class(PHA.TEST.Function).decimal1()
ClassMethod decimal1()
{
SET x=$DECIMAL($ZPI)
SET y=$DOUBLE($ZPI)
SET z=$DECIMAL(y)
IF x=y {
WRITE !,"Cache & IEEE Same"
} ELSEIF x=z {
WRITE !,"Cache & IEEE-to-Cache same"
} ELSE {
WRITE !,"三者不同"
WRITE !,"Cache decimal: ",x
WRITE !,"IEEE float: ",y
WRITE !,"IEEE to Cache: ",z
}
}
DHC-APP>d ##class(PHA.TEST.Function).decimal1()
三者不同
Cache decimal: 3.141592653589793238
IEEE float: 3.1415926535897931159
IEEE to Cache: 3.141592653589793116
次の例で$DECIMAL
は、pi の$DOUBLE
値への変換を返します。これらの変換は、異なる数値パラメーター値によって丸められます。
/// d ##class(PHA.TEST.Function).decimal2()
ClassMethod decimal2()
{
SET x=$DOUBLE($ZPI)
WRITE !,$DECIMAL(x)
/* returns 3.141592653589793116 (19 digits) */
WRITE !,$DECIMAL(x,1)
/* returns 3 */
WRITE !,$DECIMAL(x,8)
/* returns 3.1415927 (note rounding) */
WRITE !,$DECIMAL(x,12)
/* returns 3.14159265359 (note rounding) */
WRITE !,$DECIMAL(x,18)
/* returns 3.14159265358979312 */
WRITE !,$DECIMAL(x,19)
/* returns 3.141592653589793116 (19 digits) */
WRITE !,$DECIMAL(x,20)
/* returns 3.141592653589793116 (19 digits) */
WRITE !,$DECIMAL(x,21)
/* returns 3.141592653589793116 (19 digits) */
WRITE !,$DECIMAL(x,0)
/* returns 3.1415926535897931159 (20 digits) */
}
DHC-APP>d ##class(PHA.TEST.Function).decimal2()
3.141592653589793116
3
3.1415927
3.14159265359
3.14159265358979312
3.141592653589793116
3.141592653589793116
3.141592653589793116
3.1415926535897931159