数字の連結
連結演算子 (_) を使用して、ある数と別の数を連結できます。InterSystems IRIS は、まずそれぞれの数値をキャノニック形式に変換してから、その結果に対して文字列連結を実行します。したがって、12_34、12_+34、12_--34、12.0_34、12_0034.0、12E0_34 はすべて 1234 になります。12._34 の連結は 1234 になりますが、12_.34 は 12.34 になります。12_-34 の連結は文字列 “12-34” になります。
InterSystems IRIS は、キャノニック形式に変換した後の数に対して、数値の連結と算術演算を実行します。こうした演算は厳密に左から右の順に実行されます。ただし、演算の優先順位を決める括弧が指定されている場合を除きます。以下の例では、この結果について説明しています。
WRITE 7_-6+5 // returns 12
この例では、連結によって文字列 "7-6" が返されます。これが、キャノニック形式の数でないことは明白です。InterSystems IRIS は、最初の非数値文字 (埋め込みのマイナス記号) を切り捨てることで、この文字列をキャノニック形式の数に変換します。その後で、このキャノニック形式の数を使用して次の演算 7 + 5 = 12 を実行します。
浮動小数点数
InterSystems IRIS は、浮動小数点数を表すために使用できる 2 つの異なる数値タイプをサポートしています。
-
10 進数の浮動小数点 : 既定では、InterSystems IRIS は、固有の 10 進数の浮動小数点標準 ($DECIMAL 数) を使用して小数を表します。これは、ほとんどの場合の優先形式であり、IEEE バイナリ浮動小数点よりも、高いレベルの精度が得られます。これは、InterSystems IRIS がサポートしているすべてのシステム・プラットフォームで一貫しています。10 進数の浮動小数点は、データ・ベースの値で優先的に使用されます。特に、0.1 などの小数は、10 進数の浮動小数記数法を使用して正確に表現できますが、小数 0.1 (およびほとんどの 10 進数の小数) は IEEE バイナリ浮動小数点では近似値で表現できるだけです。
内部的に、10 進算術は M*(10**N) 形式の数を使用して実行されます。M は -9223372036854775808 から 9223372036854775807 の整数値を含む整数の仮数で、N は -128 から 127 の整数値を含む 10 進指数です。仮数は 64 ビット符号付整数で表され、指数は 8 ビット符号付バイトで表されます。
10 進浮動小数点の平均精度は小数桁数 18.96 桁です。仮数が 1000000000000000000 から 9223372036854775807 の小数の精度は正確に 19 桁で、922337203685477581 から 999999999999999999 の有効な小数の精度は正確に 18 桁です。IEEE バイナリ浮動小数点は、精度は低いものの (精度は小数桁数約 15.95 桁)、小数文字列としての IEEE バイナリ表現の正確な無限精度の値は、1000 桁以上の有効小数桁数を持つことができます。
以下の例では、$DECIMAL 関数は小数と 25 桁の整数を取り、19 桁の精度/有効桁数に丸められた小数を返します。
USER>WRITE $DECIMAL(1234567890.123456781818181)
1234567890.123456782
USER>WRITE $DECIMAL(1234567890123456781818181)
1234567890123456782000000
-
IEEE バイナリ浮動小数点 : IEEE 倍精度バイナリ浮動小数点は、小数を表現する業界標準の方法です。IEEE 浮動小数点数は、バイナリ表現でエンコードされます。バイナリ浮動小数点表現は、ほとんどのコンピュータがバイナリ浮動小数点演算のための高速ハードウェアを搭載しているため、通常、高速計算を実行する場合に優先的に使用されます。
内部的に、IEEE バイナリ算術は S*M*(2**N) 形式の数を使用して実行されます。S は -1 または +1 の値を含む符号で、M は 1 番目と 2 番目のバイナリ・ビット間に 2 進小数点がある 53 ビットのバイナリ小数値を含む仮数で、N は -1022 から 1023 の整数値を含む 2 進指数です。このため、表現は 64 ビットで構成されます。S は 1 つの符号ビット、指数 N は次の 11 ビットに格納され (2 つの追加の値が予約されます)、仮数 M は >=1.0 かつ <2.0 で最後の 52 ビットを含み、合計 53 バイナリ・ビットの精度となります。(M の最初のビットは常に 1 であるため、64 ビット表現に出現する必要はありません。)
倍精度バイナリ小数点の精度は 53 バイナリ・ビットで、小数点以下約 15.95 桁の精度に相当します。(対応する 10 進数の精度は 15.35 から 16.55 桁の間で変動します。)
バイナリ表現は、0.1 などの小数をバイナリ小数の有限シーケンスとして表現できないため、10 進数の小数と正確には一致しません。ほとんどの小数はこのバイナリ表現では正確に表すことができないため、IEEE 浮動小数点数は対応する InterSystems の 10 進浮動小数点数とは若干異なる場合があります。IEEE 浮動小数点数が小数として表示されるとき、バイナリ・ビットが18 桁を大幅に超える小数桁数の小数に変換されることがよくあります。これは、IEEE 浮動小数点数が InterSystems の 10 進浮動小数点数より精度が高いことを意味するわけではありません。IEEE 浮動小数点数は、InterSystems の10 進数よりも大きい数および小さい数を表現できます。
以下の例では、$DOUBLE 関数は 17 桁の整数のシーケンスを取り、小数点以下の有効桁数約 16 桁の値を返します。
USER>FOR i=12345678901234558:1:12345678901234569 {W $DOUBLE(i),!}
12345678901234558
12345678901234560
12345678901234560
12345678901234560
12345678901234562
12345678901234564
12345678901234564
12345678901234564
12345678901234566
12345678901234568
12345678901234568
12345678901234568
IEEE バイナリ浮動小数点は、特殊な値 INF (無限大) と NAN (非数値) をサポートします。詳細は、"$DOUBLE 関数" を参照してください。
INF および NAN 値を扱うための IEEEError 設定と、$LIST 構造データ内の IEEE 浮動小数点数の圧縮を扱うための ListFormat 設定を使用して、IEEE 浮動小数点数の処理を構成できます。どちらも、%SYSTEM.ProcessOpens in a new tab クラス・メソッド $SYSTEM.Process.IEEEError()Opens in a new tab を使用して、現在のプロセスに表示および設定できます。InterSystems IRIS の管理ポータルで [システム管理] から [構成]、[追加の設定]、[互換性] を選択して、システム全体の既定値を設定できます。
$DOUBLE 関数を使用して、InterSystems IRIS 標準の浮動小数点数を IEEE 浮動小数点数に変換できます。また、$DECIMAL 関数を使用して、IEEE 浮動小数点数を InterSystems IRIS 標準の浮動小数点数に変換できます。
既定では、InterSystems IRIS は小数をキャノニック形式に変換して、先頭のゼロをすべて削除します。したがって、0.66 は .66 となります。$FNUMBER (ほとんどの形式) および $JUSTIFY (3 パラメータ形式) は常に、最低 1 桁の整数を伴う小数を返します。これらの関数のいずれかを使用した場合、.66 は 0.66 となります。
$FNUMBER および $JUSTIFY を使用すれば、指定した小数桁数に対して丸めや埋め込みを行うことができます。InterSystems IRIS では、5 以上を切り上げて、4 以下を切り捨てます。埋め込みでは、ゼロを必要な小数桁だけ追加します。少数を整数に丸めた場合、小数点区切り文字は削除されます。整数をゼロ・パディングして小数にした場合、小数点区切り文字が追加されます。
極端に大きな数字
正確に表現できる最大の整数は、19 桁の整数の -9223372036854775808 と 9223372036854775807 です。なぜなら、これらの数値は 64 ビット符号付き整数で表現できる最大数だからです。これを超える整数は、この 64 ビット制限に収まるように自動的に丸められます。以下に例を示します。
SET x=9223372036854775807
WRITE x,!
SET y=x+1
WRITE y
同様に、128 を超える指数も、64 ビット符号付き整数の表現になるように自動的に丸められます。以下に例を示します。
WRITE 9223372036854775807e-128,!
WRITE 9223372036854775807e-129
この丸めにより、19 桁の整数を超える数になる算術演算は、下位の桁がゼロに置き換えられます。これにより、以下のような状況となる可能性があります。
SET longnum=9223372036854775790
WRITE longnum,!
SET add17=longnum+17
SET add21=longnum+21
SET add24=longnum+24
WRITE add17,!,add24,!,add21,!
IF add24=add21 {WRITE "adding 21 same as adding 24"}
InterSystems IRIS でサポートされる最大の 10 進数の浮動小数点数は 9.223372036854775807E145 です。サポートされる最大の $DOUBLE 値 (INFINITY への IEEE オーバーフローが無効であると想定) は 1.7976931348623157081E308 です。$DOUBLE 型は、InterSystems IRIS の 10 進数型よりも広い範囲の値をサポートしますが、InterSystems IRIS の 10 進数型の方が高精度をサポートします。InterSystems IRIS の 10 進数型の精度は約 18.96 桁 (普通は 19 桁ですが、時折 18 桁の精度) で、$DOUBLE 型の通常の精度は約 15.95 桁 (53 バイナリ桁) です。既定では、InterSystems IRIS は数値リテラルを 10 進数の浮動小数点数として表現します。ただし、数値リテラルが InterSystems IRIS の 10 進数で表現できる数値より大きい場合 (9.223372036854775807E145 より大きい場合)、InterSystems IRIS はその数値を $DOUBLE 表現に自動的に変換します。
1.7976931348623157081E308 (308 桁または 309 桁) より大きな数値の場合、<MAXNUMBER> エラーが発生します。
10 進数の浮動小数点からバイナリ浮動小数点への自動変換のため、丸めの動作は、9.223372036854775807E145 (整数に応じて 146 桁または 147 桁) で変更されます。詳細は、以下の例を参照してください。
TRY {
SET a=1
FOR i=1:1:310 {SET a=a_1 WRITE i+1," digits = ",+a,! }
}
CATCH exp { WRITE "In the CATCH block",!
IF 1=exp.%IsA("%Exception.SystemException") {
WRITE "System exception",!
WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
WRITE "Location: ",exp.Location,!
WRITE "Code: "
}
ELSE { WRITE "Some other type of exception",! RETURN }
WRITE exp.Code,!
WRITE "Data: ",exp.Data,!
RETURN
}
TRY {
SET a=9
FOR i=1:1:310 {SET a=a_9 WRITE i+1," digits = ",+a,! }
}
CATCH exp { WRITE "In the CATCH block",!
IF 1=exp.%IsA("%Exception.SystemException") {
WRITE "System exception",!
WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
WRITE "Location: ",exp.Location,!
WRITE "Code: "
}
ELSE { WRITE "Some other type of exception",! RETURN }
WRITE exp.Code,!
WRITE "Data: ",exp.Data,!
RETURN
}
309 桁より大きな数値は数値文字列として表現できます。この値は数値ではなく文字列として保存されるため、丸めも <MAXNUMBER> エラーも適用されません。
SET a="1"
FOR i=1:1:360 {SET a=a_"1" WRITE i+1," characters = ",a,! }
許可される最大桁数を超える数値になる指数は、<MAXNUMBER> エラーを生成します。指数の最大許容数は、その指数を受け入れる数のサイズによって異なります。1 桁の仮数の場合、最大指数は 307 または 308 です。
InterSystems IRIS の小数または IEEE 倍精度数を使用する際の大きな数字に関する考慮事項の詳細は、"サーバ側プログラミングの入門ガイド" の付録 “インターシステムズ・アプリケーションでの数値の計算” を参照してください。