算術演算子¶
算術演算子は、1つ以上の入力式から数値出力を生成するために使用されます。
次の場合を除き、入力式は数値(固定小数点または浮動小数点)でなければなりません。
単項演算子
+
は数値文字列を取ることができますが、これにより文字列は対応する数値に暗黙的に変換されます。2項演算子
-
は DATE 式に適用できます。
このトピックの内容:
算術演算子のリスト¶
演算子 |
構文 |
説明 |
---|---|---|
|
|
|
|
|
2つの数値式( |
|
|
入力数値式を否定します。 |
|
|
ある数式( |
|
|
1つの日付式( |
|
|
2つの数値式( |
|
|
1つの数式( |
|
|
|
算術演算のスケールと精度¶
算術演算の出力の スケール および 精度 は、入力のスケールと精度に依存します。
このセクションでは、Snowflakeがさまざまな算術演算(乗算、除算など)によって生成される数値出力のスケールと精度を保持するために使用する計算について説明します。このセクションでは、次の説明が使用されます。
- 先頭の数字:
数値の小数点の左側の桁数(
L
)です。- スケール:
数値の小数点の右側の桁数(
S
)です。- 精度:
数値の合計桁数(
P
)で、先頭の桁とスケールの合計として計算されます(P = L + S
)。Snowflakeの精度は常に38に制限されています。関連項目:
固定小数点データ型(NUMBER、 DECIMALなど)は、精度とスケールを利用します。例えば、 DECIMAL(8、2)データ型の場合、精度は8、スケールは2、先頭桁は6です。
浮動小数点データ型(FLOAT、 DOUBLE、 REALなど)は、8バイトの倍精度を利用します。
出力の場合、これらは最大桁数になります。特定の出力の実際の桁数はこれより少ない場合があります。
乗算¶
乗算を実行する場合:
出力の先頭桁の数は、両方の入力の先頭桁の合計です。
Snowflakeは、入力のいずれかが12より大きいスケールを持たない限り、両方の入力のスケールに最大入力しきい値12桁までの桁数を追加することにより、潜在的なオーバーフロー(連鎖乗算による)を最小限に抑えます。入力のいずれかが12より大きいスケールの場合は、大きな入力スケールを出力スケールとして使用します。
つまり、2つの入力(L1.S1
および L2.S2
)を使用した乗算演算を想定すると、出力の最大桁数は次のように計算されます。
- 先頭の数字:
L = L1 + L2
- スケール:
S = min(S1 + S2, max(S1, S2, 12))
- 精度:
P = L + S
注釈
Snowflakeは数値の整数乗算を実行するため、中間結果がオーバーフローを引き起こす可能性があります。ただし、最終出力はオーバーフローしません。
例¶
select 10.01 n1, 1.1 n2, n1 * n2;
+-------+-----+---------+
| N1 | N2 | N1 * N2 |
|-------+-----+---------|
| 10.01 | 1.1 | 11.011 |
+-------+-----+---------+
select 10.001 n1, .001 n2, n1 * n2;
+--------+-------+----------+
| I1 | I2 | I1 * I2 |
|--------+-------+----------|
| 10.001 | 0.001 | 0.010001 |
+--------+-------+----------+
select .1 n1, .0000000000001 n2, n1 * n2;
+-----+-----------------+-----------------+
| N1 | N2 | N1 * N2 |
|-----+-----------------+-----------------|
| 0.1 | 0.0000000000001 | 0.0000000000000 |
+-----+-----------------+-----------------+
除算¶
除算を実行する場合:
出力の先頭桁は、分子の先頭桁と分母のスケールの合計です。
Snowflakeは、分子のスケールが12より大きくない限り、分子のスケールに最大しきい値12桁まで6桁を追加することにより、出力の潜在的なオーバーフロー(連鎖除算による)とスケールの損失を最小限に抑えます。分子のスケールが12より大きい場合は、分子のスケールを出力スケールとして使用します。
つまり、分子 L1.S1
および分母 L2.S2
による除算演算を想定すると、出力の最大桁数は次のように計算されます。
- 先頭の数字:
L = L1 + S2
- スケール:
S = max(S1, min(S1 + 6, 12))
- 精度:
P = L + S
除算演算の結果が出力スケールを超える場合、Snowflakeは(出力を切り捨てるのではなく)出力を丸めます。
注釈
乗算と同様に、中間除算の結果はオーバーフローを引き起こす可能性があります。ただし、最終出力はオーバーフローしません。
例¶
select 2 n1, 7 n2, n1 / n2;
+----+----+----------+
| N1 | N2 | N1 / N2 |
|----+----+----------|
| 2 | 7 | 0.285714 |
+----+----+----------+
select 10.1 n1, 2.1 n2, n1 / n2;
+------+-----+-----------+
| N1 | N2 | N1 / N2 |
|------+-----+-----------|
| 10.1 | 2.1 | 4.8095238 |
+------+-----+-----------+
select 10.001 n1, .001 n2, n1 / n2;
+--------+-------+-----------------+
| N1 | N2 | N1 / N2 |
|--------+-------+-----------------|
| 10.001 | 0.001 | 10001.000000000 |
+--------+-------+-----------------+
select .1 n1, .0000000000001 n2, n1 / n2;
+-----+-----------------+-----------------------+
| N1 | N2 | N1 / N2 |
|-----+-----------------+-----------------------|
| 0.1 | 0.0000000000001 | 1000000000000.0000000 |
+-----+-----------------+-----------------------+
加算と減算¶
加算または減算の場合:
出力の先頭桁は、入力の先頭桁の最大数に1を加えたものです(キャリー値を保持するため)。
出力のスケールは、入力の最大スケールです。
つまり、加算または減算演算に2つの入力(L1.S1
および L2.S2
)があると想定すると、出力の最大桁数は次のように計算されます。
- 先頭の数字:
L = max(L1, L2) + 1
- スケール:
S = max(S1, S2)
- 精度:
P = L + S
その他のN項演算¶
モジュロ(a % b
または MOD)など、複数の数値入力を使用する他のすべての算術演算の場合:
出力の先頭にある数値は、入力の先頭にある数値の最大数です。
出力のスケールは、入力の最大スケールです。
つまり、入力 L1.S1
、 L2.S2
などのN項演算を想定すると、出力の最大桁数は次のように計算されます。
- 先頭の数字:
L = max(L1, L2, ...)
- スケール:
S = max(S1, S2, ...)
- 精度:
P = L + S
単項演算¶
単項算術演算は、出力精度を明示的に指定できる ROUND を除き、入力精度とスケールと同じ出力精度とスケールを持ちます。
ビット演算¶
サポートされているビットごとの算術演算のリストは、 条件式関数 に掲載されています。
注意:
数値の場合、ビット単位の演算は入力の先頭の数字に対してのみ動作します。出力のスケールは常にゼロです。
バイナリビット演算の場合、出力の先頭桁数は入力の最大先頭桁数と同じです。