数値#

Xarpiteは数値の扱いをサポートしています。

概要#

数値を表す型#

数値を表す型には32ビット整数 INT と64ビット浮動小数点数 DOUBLE があります。

数値を意味する文字列との区別#

Xarpiteでは数値と数値を意味する文字列は厳格に区別され、演算子や関数の挙動に違いを与えます。

$ xa '123 + 1'
# 124

$ xa '"123" + 1'
# 1231

数値を文字列にするには文字列化演算子 &value を使います。

その逆は数値化演算子 +value です。

$ xa '&123 + 1'
# 1231

$ xa '+"123" + 1'
# 124

数値リテラル#

123: 整数リテラル#

1個以上の数字の列は整数リテラルになります。

$ xa '123'
# 123

0で始まる数字列であっても常に10進数として解釈されます。

$ xa '00123'
# 123

H#123abc: 16進整数リテラル#

H# に続いて16進数を書くことができます。

H# の部分は大文字でなければなりませんが、16進数の部分は大文字小文字を区別しません。

$ xa 'H#FF'
# 255

1.23: 浮動小数点数リテラル#

実数を「整数部 . 小数部」の形で書くことができます。

実数値の表現や演算には計算誤差が含まれます。

$ xa '1.5'
# 1.5

数値系リテラルの区切り文字#

数値系リテラルは、共通して数字列の先頭以外の任意の場所に任意の個数の _ を書くことができます。

_ は単に無視されます。

これにより、大きな桁数の数値を読みやすく記述できます。

$ xa '1_000_000'
# 1000000

$ xa '1__2__3__'
# 123

$ xa 'H#FF_FF'
# 65535

$ xa '1_000.5'
# 1000.5

$ xa '1.5_0_0'
# 1.5

数値化#

値を数値に変換する演算子と関数があります。

値の型によって数値化の挙動は異なります。

値のタイプ 数値化の結果
NULL 0
数値 その数値自身
論理値 TRUEなら1、FALSEなら0
文字列 数値としてパースした結果
ストリーム 各要素の合計

+value: 数値化#

前置 + 演算子は値の数値化を行います。

主な用途は、文字列として表現されている数値データを内部的な数値に変換することです。

$ xa ' "+123"'
# +123

$ xa '+"+123"'
# 123

数値化は、値の +_ メソッドを参照します。

オブジェクトの +_ メソッドをオーバーライドすることで、数値化の処理を変更することができます。

$ xa '+{`+_`: this -> this.value * 2}{value: 100}'
# 200

-value: 負の数値化#

前置 - 演算子は数値化演算子と似ていますが、その値を負にします。

この演算子は「任意の値を数値に変換する処理」と「数値を負にする処理」を同時に行います。

$ xa '-"123"'
# -123

$ xa '-(100 + 20 + 3)'
# -123

TO_NUMBER: 数値化#

TO_NUMBER(value: VALUE): NUMBER

値を数値に変換します。

+value 演算子と同じ動作をします。

$ xa 'TO_NUMBER("123")'
# 123

$ xa '1, 2, 3 >> TO_NUMBER'
# 6

$ xa 'TO_NUMBER(NULL)'
# 0

加減算系演算子#

加減算系演算子は加減算に類する動作を行う演算子で構成されます。

加減算系演算子は左優先結合です。

number + number: 加算#

加算演算子は、2つの値を加算します。

$ xa '1 + 2'
# 3

加算演算子は左辺の型によって異なる働きをします。

左辺の型 動作
数値 左辺と右辺の和を返す
文字列 左辺と右辺を連結した文字列を返す
配列 左辺と右辺を連結した配列を生成する
オブジェクト 左辺のオブジェクトに右辺の各エントリーを代入したオブジェクトを生成する

加算演算のオーバーライド#

加算メソッド _+_ を実装することで、オブジェクトの加算演算をカスタマイズできます。

$ xa '
  Obj := {
    `_+_`: this, other -> this.value + other.value
  }

  Obj{value: 100} + Obj{value: 23}
'
# 123

number - number: 減算#

減算演算子は、2つの値を減算します。

$ xa '3 - 1'
# 2

減算演算子も加算演算子と同様、オーバーライドができます。

$ xa '
  Obj := {
    `_-_`: this, other -> this.value - other.value
  }

  Obj{value: 123} - Obj{value: 23}
'
# 100

乗除算系演算子#

乗除算系演算子は乗除算に類する動作を行う演算子で構成されます。

乗除算系演算子は左優先結合です。

number * number: 乗算#

乗算演算子は、2つの値を乗算します。

$ xa '2 * 3'
# 6

文字列の乗算はその文字列を繰り返します。

$ xa '"abc" * 3'
# abcabcabc

配列の乗算はその配列を繰り返します。

$ xa '[1, 2, 3] * 3'
# [1;2;3;1;2;3;1;2;3]

number / number: 除算#

除算演算子は、2つの値を除算します。

$ xa '6 / 3'
# 2.0

整数同士の除算でも、結果は浮動小数点数で返されます。

$ xa '7 / 4'
# 1.75

number % number: 剰余#

剰余演算子は、2つの値を除算し、その余りを返します。

$ xa '7 % 4'
# 3

小数も扱うことができます。

$ xa '1.75 % 0.5'
# 0.25

integer %% integer: 整除性#

左辺の値が右辺の値で割り切れるかどうかを返します。

$ xa '7 %% 4'
# FALSE

小数も扱うことができます。

$ xa '1.5 %% 0.5'
# TRUE

$ xa '1.75 %% 0.5'
# FALSE

integer !%% integer: 否定整除性#

左辺の値が右辺の値で割り切れないかどうかを返します。

この演算子は整除性演算子の否定 !(integer %% integer) と等価です。

$ xa '7 !%% 4'
# TRUE

べき乗系演算子#

べき乗系演算子はべき乗演算子のみで構成されます。

べき乗系演算子は右優先結合です。

number ^ number: べき乗#

べき乗演算子は、左辺の値を右辺の値で累乗します。

整数の整数乗の結果も浮動小数点数で返されます。

$ xa '2 ^ 3'
# 8.0

同じことができる関数 POW もあります。

$ xa 'POW(2; 3)'
# 8.0

絶対値#

数値に対する長さ取得演算子 $#number は、数値の絶対値を返します。

$ xa '$#10'
# 10

$ xa '$#-10'
# 10

組み込み定数#

数値系の組み込み定数です。

定数 意味
MATH.PI 円周率
MATH.E ネイピア数

組み込み関数#

ABS: 絶対値の取得#

ABS(value: NUMBER): NUMBER

第1引数の絶対値を返します。

$ xa 'ABS(-10)'
# 10

FLOOR: 小数点以下切り捨て#

FLOOR(number: NUMBER): INT

第1引数の数値を、値が小さい方の整数に丸めます。

$ xa 'FLOOR(1.5)'
# 1

DIV: 除算の整数部#

DIV(x: NUMBER; y: NUMBER): NUMBER

xy で割り、その結果の整数部分を返します。

$ xa 'DIV(10; 3)'
# 3

SQRT: 平方根の取得#

SQRT(number: NUMBER): NUMBER

第1引数の正の平方根を返します。

$ xa '"$%.3f(  SQRT(100.0)  )"'
# 10.000

SIN: 正弦#

SIN(number: NUMBER): NUMBER

第1引数をラジアンとして解釈し、その正弦を返します。

$ xa '"$%.3f(  SIN(PI / 2)  )"'
# 1.000

COS: 余弦#

COS(number: NUMBER): NUMBER

第1引数をラジアンとして解釈し、その余弦を返します。

$ xa '"$%.3f(  COS(0)  )"'
# 1.000

TAN: 正接#

TAN(number: NUMBER): NUMBER

第1引数をラジアンとして解釈し、その正接を返します。

$ xa '"$%.3f(  TAN(PI / 4)  )"'
# 1.000

POW: べき乗#

POW(base: NUMBER; exponent: NUMBER): NUMBER

第1引数を第2引数でべき乗した結果を返します。

$ xa 'POW(2; 3)'
# 8.0

EXP: 指数関数#

EXP(number: NUMBER): NUMBER

第1引数の指数関数(底 e)を返します。

$ xa '"$%.3f(  EXP(1)  )"'
# 2.718

$ xa '"$%.3f(  EXP(2)  )"'
# 7.389

LOG: 自然対数#

LOG(number: NUMBER): NUMBER

第1引数の自然対数(底 e)を返します。

$ xa '"$%.3f(  LOG(MATH.E)  )"'
# 1.000

RAND: 乱数の取得#

RAND(): DOUBLE

RAND([from: NUMBER; ]until: NUMBER): INT

引数なしで呼び出された場合、0以上1未満の小数を返します。

1引数で呼び出された場合、0以上 until 未満の整数を返します。

2引数で呼び出された場合、from 以上 until 未満の整数を返します。