第12章Caché関数コレクション$ DECIMAL関数

記事ディレクトリ

第12章Caché関数コレクション$ DECIMAL関数

Caché浮動小数点値に変換された数値を返します。

概要

$DECIMAL(num,digits)

パラメータ

  • num変換する数値。通常、これはIEEE浮動小数点数です。
  • digitsオプション-返される有効桁数を指定する整数。$DECIMALIEEE浮動小数点丸めアルゴリズムを使用して、戻り値をこの桁数に丸めます。有効な値は、1から38、および0です。桁数が桁数より大きい場合、値は変更されません。桁数が0の場合、有効桁数が20桁を超えない限り、numは丸められません。

解説

$DECIMALは、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

おすすめ

転載: blog.csdn.net/yaoxin521123/article/details/108355040