算術関数
概要
算術関数は、UInt8
、UInt16
、UInt32
、UInt64
、Int8
、Int16
、Int32
、Int64
、Float32
、または Float64
の任意の2つのオペランドで動作します。
操作を実行する前に、両方のオペランドは結果型にキャストされます。結果型は以下のように決定されます(以下の関数ドキュメントで別途指定されていない限り):
- 両方のオペランドが32ビット幅までの場合、結果型のサイズは、2つのオペランドのうちの大きい方の次に大きい型のサイズになります(整数サイズの昇格)。例えば
UInt8 + UInt16 = UInt32
またはFloat32 * Float32 = Float64
です。 - オペランドの1つが64ビット以上の場合、結果型のサイズは2つのオペランドのうちの大きい方と同じサイズになります。例えば
UInt32 + UInt128 = UInt128
またはFloat32 * Float64 = Float64
です。 - オペランドの1つが符号付きの場合、結果型も符号付きになります。そうでない場合は符号なしになります。例えば
UInt32 * Int32 = Int64
です。
これらのルールは、結果型がすべての可能な結果を表現できる最小の型になることを保証します。このことは、値の範囲境界周辺でのオーバーフローのリスクを導入しますが、計算が最大のネイティブ整数幅64ビットを使用して迅速に行われることを保証します。この動作はまた、64ビット整数(BIGINT)を最も大きな整数型として提供する他の多くのデータベースとの互換性を保証します。
例:
オーバーフローはC++と同じ方法で発生します。
abs
導入時期: v1.1
x
の絶対値を計算します。x
が符号なし型である場合、効果はありません。x
が符号付き型である場合、符号なしの数を返します。
構文
引数
x
— 絶対値を取得する値
返される値
x
の絶対値
例
使用例
byteSwap
導入時期: v23.10
整数のバイトを逆順にします。つまり、その エンディアン を変更します。
以下の例は次のように計算できます:
- 10進数の整数をビッグエンディアン形式の16進数に変換します。例: 3351772109 -> C7 C7 FB CD (4バイト)
- バイトを逆にします。例: C7 C7 FB CD -> CD FB C7 C7
- 結果をビッグエンディアンと仮定して整数に戻します。例: CD FB C7 C7 -> 3455829959 この関数の使用例は、IPv4を逆転させることです:
構文
引数
x
— 整数値。(U)Int*
返される値
バイトを逆にした x
を返します。 (U)Int*
例
使用例
8ビット
16ビット
32ビット
64ビット
divide
導入時期: v1.1
a
とb
の2つの値の商を計算します。結果の型は常に Float64 です。整数の除算は intDiv
関数によって提供されます。
0
で割ると inf
、 -inf
、または nan
を返します。
構文
引数
x
— 被除数 -y
— 除数
返される値
x
と y
の商
例
2つの数値の割り算
0で割り算
divideDecimal
導入時期: v22.12
2つの小数を除算します。結果の値の型は Decimal256 になります。結果スケールは result_scale
引数で明示的に指定することができます(範囲 [0, 76]
の定数整数)。指定しない場合、結果のスケールは与えられた引数の最大スケールになります。
これらの関数は通常の divide
よりもかなり遅く動作します。
制御された精度が本当に必要ない場合や、迅速な計算が必要な場合は、 divide を使用することを検討してください。
構文
引数
返される値
指定されたスケールでの除算の結果。 Decimal256
例
例1
例2
divideOrNull
導入時期: v25.5
divide
と同じですが、0で割るとNULLを返します。
構文
引数
x
— 被除数 -y
— 除数
返される値
x
と y
の商、またはNULL。
例
0で割り算
gcd
導入時期: v1.1
2つの値 a
と b
の最大公約数を返します。
0で割るか、最小の負の数をマイナス1で割ると例外がスローされます。
構文
引数
x
— 第1整数 -y
— 第2整数
返される値
x
と y
の最大公約数。
例
使用例
ifNotFinite
導入時期: v20.3
浮動小数点値が有限かどうかをチェックします。
三項演算子を使用することで同様の結果を得ることができます: isFinite(x) ? x : y
。
構文
引数
返される値
x
が有限の場合はx
。x
が有限でない場合はy
。
例
使用例
intDiv
導入時期: v1.1
2つの値 x
を y
で整数除算します。つまり、次に小さい整数に切り下げた商を計算します。
結果は被除数(最初のパラメータ)と同じ幅になります。
0で割ると例外がスローされ、商が被除数の範囲に収まらない場合、または最小の負の数をマイナス1で割ると例外がスローされます。
構文
引数
x
— 左側のオペランド。 -y
— 右側のオペランド。
返される値
x
と y
の整数除算結果
例
2つの浮動小数点の整数除算
商が被除数の範囲に収まらない
intDivOrNull
導入時期: v25.5
intDiv
と同じですが、0で割るか最小の負の数をマイナス1で割るとNULLを返します。
構文
引数
返される値
x
と y
の整数除算結果、またはNULL。
例
0による整数除算
最小の負の数をマイナス1で割った場合
intDivOrZero
導入時期: v1.1
intDiv
と同じですが、0で割るとゼロを返します。最小の負の数をマイナス1で割った場合もゼロを返します。
構文
引数
返される値
a
と b
の整数除算結果、またはゼロ。
例
0による整数除算
最小の負の数をマイナス1で割った場合
isFinite
導入時期: v1.1
Float32 または Float64 の引数が無限でなく、 NaN
でない場合は 1
を返します。それ以外の場合、この関数は 0
を返します。
構文
引数
x
— 有限性を確認する数。Float*
返される値
x
が無限でなく NaN
でない場合は 1
、それ以外は 0
。
例
数が有限であるかをテスト
isInfinite
導入時期: v1.1
Float32 または Float64 の引数が無限の場合は 1
を返します。それ以外の場合、この関数は 0
を返します。
NaN
の場合は 0
が返されることに注意してください。
構文
引数
x
— 無限かどうかを確認する数。Float*
返される値
x
が無限の場合は 1
、それ以外は 0
(NaN
を含む)。
例
数が無限であるかをテスト
isNaN
導入時期: v1.1
Float32 及び Float64 の引数が NaN
の場合は 1
を返します。それ以外の場合は 0
を返します。
構文
引数
x
—NaN
かどうか評価する引数。Float*
返される値
NaN
の場合は 1
、それ以外は 0
。
例
使用例
lcm
導入時期: v1.1
2つの値 x
と y
の最小公倍数を返します。
0で割るか、最小の負の数をマイナス1で割ると例外がスローされます。
構文
引数
返される値
x
と y
の最小公倍数を返します。 (U)Int*
例
使用例
max2
導入時期: v21.11
2つの数値 x
と y
のうち大きい方を返します。
構文
引数
x
— 第一の値(U)Int8/16/32/64
またはFloat*
またはDecimal
y
— 第二の値(U)Int8/16/32/64
またはFloat*
またはDecimal
返される値
x
と y
の大きい方の値を返します。 Float64
例
使用例
min2
導入時期: v21.11
2つの数値 x
と y
のうち小さい方を返します。
構文
引数
x
— 第一の値(U)Int8/16/32/64
またはFloat*
またはDecimal
y
— 第二の値(U)Int8/16/32/64
またはFloat*
またはDecimal
返される値
x
と y
の小さい方の値を返します。 Float64
例
使用例
minus
導入時期: v1.1
2つの値 a
と b
の差を計算します。結果は常に符号付きです。
プラスと同様に、整数を日付または時間付き日付から減算することが可能です。
さらに、時間付きの間の日付間の減算もサポートされており、それにより両者の間の時間差が得られます。
構文
引数
x
— 被減数。 -y
— 減算数。
返される値
x
マイナス y
例
2つの数を引き算
整数と日付を引き算
modulo
導入時期: v1.1
2つの値 a
を b
で割った余りを計算します。
入力が両方とも整数の場合、結果の型は整数になります。入力の1つが浮動小数点数の場合、結果の型は Float64 になります。
余りはC++と同様に計算されます。負の数には切り捨て除算が使用されます。
0で割る場合や最小の負の数をマイナス1で割る場合は例外がスローされます。
構文
引数
a
— 被除数 -b
— 除数(モジュラス)
返される値
a % b
の余り
例
使用例
moduloOrNull
導入時期: v25.5
a
を b
で割った余りを計算します。modulo
関数と似ていますが、moduloOrNull
は右側の引数が 0 の場合は NULL を返します。
構文
引数
返される値
x
を y
で割った余りを返します。除数がゼロの場合は null を返します。
例
0による moduloOrNull
moduloOrZero
導入時期: v20.3
modulo に似ますが、除数がゼロの場合はゼロを返し、modulo 関数では例外をスローします。
構文
引数
返される値
a % b
の余りを返します。除数が 0
の場合は 0
を返します。
例
使用例
multiply
導入時期: v1.1
2つの値 x
と y
の積を計算します。
構文
引数
返される値
x
と y
の積を返します。
例
2つの数を掛ける
multiplyDecimal
導入時期: v22.12
2つの小数を掛けます。結果の値は Decimal256 の型になります。結果スケールは result_scale
引数で明示的に指定できます(範囲 [0, 76]
の定数整数)。指定しない場合は、結果スケールは与えられた引数の最大スケールになります。
これらの関数は通常の multiply
よりもかなり遅く処理されます。
制御された精度が本当に必要ない場合や、迅速な計算が必要な場合は、 multiply の使用を検討してください。
構文
引数
返される値
指定されたスケールでの掛け算の結果。型: Decimal256
例
使用例
通常の乗算との違い
小数のオーバーフロー
negate
導入時期: v1.1
引数 x
の符号を反転させます。結果は常に符号付きです。
構文
引数
x
— 反転する値。
返される値
x
の -x を返します。
例
使用例
plus
導入時期: v1.1
2つの値 x
と y
の合計を計算します。エイリアス: x + y
(演算子)。
整数と日付または時間付き日付を加算することが可能です。前者は日付の日数を増やし、後者は時間付きの日付の秒数を増やします。
構文
引数
x
— 左側のオペランド。 -y
— 右側のオペランド。
返される値
x
と y
の合計を返します。
例
2つの数を加算
整数と日付を加算
positiveModulo
導入時期: v22.11
x
を y
で割った余りを計算します。modulo
関数と似ていますが、positiveModulo
は常に非負の数を返します。
構文
引数
返される値
x
と y
で割り切れる最も近い整数より小さい x
の値の差を返します。
例
使用例
positiveModuloOrNull
導入時期: v25.5
a
を b
で割った余りを計算します。positiveModulo
関数と似ていますが、positiveModuloOrNull
は右側の引数が 0 の場合は NULL を返します。
構文
引数
x
— 被除数。(U)Int*
/Float32/64
. -x
— 除数(モジュラス)。(U)Int*
/Float32/64
.
返される値
x
と y
で割り切れる最も近い整数より小さい x
の値の差を返し除数がゼロのときは null
を返します。
例
positiveModuloOrNull