このパートでは、数値の基本的な扱い方法について扱います。
レッスン1 数値リテラル
0
から9
までの数字の塊は整数リテラルです。
$ fl7 '123456'
123456
先頭が0で始まっても10進数です。
$ fl7 '0123456'
123456
ピリオド.
が1個数字列の間に挟まった数字の塊は小数リテラルです。
小数リテラルは浮動小数点数を生み出します。
$ fl7 '00003.140000'
3.14
末尾にe
もしくはE
に続いて整数が書かれたものは指数リテラルです。
指数リテラルも浮動小数点数を生み出します。
$ fl7 '00003.140000E100'
3.14e+100
$ fl7 '00003.140000e-100'
3.14e+-00
$ fl7 '00003.140000e+000100'
3.14e+100
レッスン2 丸括弧
括弧演算子(
)
は、囲んだ内部のひとまとまりの式を表します。
括弧演算子は式の区切りを明確にするだけで、(この時点では)特別な効果は何も効果はありません。
式の区切りを与える効果はしばしば「先に計算する」のように表現されます。
$ fl7 '(00003.140000)'
3.14
括弧演算子は同じ対象に好きなだけ大量に書けます。
$ fl7 '(((((00003.140000)))))'
3.14
レッスン3 符号
前置+
および-
は符号の演算子です。
+
は数値に対しては特に何もせず、-
は数値を負にします。
$ fl7 '+00003.140000'
3.14
$ fl7 '-00003.140000'
-3.14
符号は数値リテラル以外に対しても書けます。
その場合も効果は概ね変わりません。
$ fl7 '-(00003.140000)'
-3.14
$ fl7 '-(-(00003.140000))'
3.14
符号は同じ対象に大量に書けます。
$ fl7 '+-++-+---+--++-+-++--+-00003.140000'
3.14
この場合、符号列の右から順に効果を適用します。
数値の3.14に対してまず-
で符号を反転させ、次に+
で何もせず、2連続の-
の効果で符号を2回逆転させ、以降同様の処理を残りの全ての符号に対して適用します。
レッスン4 四則演算
中置+
-
*
/
演算子は、それぞれ加算・減算・乗算・除算です。
整数同士の除算は小数になります。
$ fl7 '1 + 2'
3
$ fl7 '1 - 2'
-1
$ fl7 '1 * 2'
2
$ fl7 '1 / 2'
0.5
演算子には結合の優先度があり、乗除算は加減算よりも先にまとまります。
$ fl7 '1 + 2 * 10'
21
$ fl7 '1 + (2 * 10)'
21
$ fl7 '(1 + 2) * 10'
30
また、四則演算においては、同じ結合優先度の演算子同士は左から順にまとまります(左優先結合)。
$ fl7 '1 - 2 - 3'
-4
$ fl7 '(1 - 2) - 3'
-4
$ fl7 '1 - (2 - 3)'
2
レッスン5 べき乗
fluorite-7では、べき乗を中置^
で表現します。
$ fl7 '2 ^ 8'
256
べき乗演算子は乗除算演算子よりも結合優先度が高く、かつ右優先結合です。
$ fl7 '10 * 2 ^ 2 ^ 3 * 10'
25600
$ fl7 '10 * (2 ^ (2 ^ 3)) * 10'
25600
fluorite-7では、すべての前置演算子は、すべての中置演算子よりも結合優先度が高いです。
これはべき乗よりも符号が優先されることを意味します。
$ fl7 '-2 ^ 4'
16
$ fl7 '(-2) ^ 4'
16
$ fl7 '-(2 ^ 4)'
-16
これは数学の式や他のいくつかの言語と異なり、Excelと似ています。
$ perl -E 'say -2 ** 4'
-16
レッスン6 剰余
中置%
は剰余演算子です。
剰余演算子は乗除算演算子と同優先度です。
細かい仕様はJavaScriptの同演算子に従います。
$ fl7 '10 % 3'
1
$ fl7 '10.5 % 3.33'
0.5099999999999998
$ fl7 '-10.5 % 3.33'
-0.5099999999999998
$ fl7 '-10.5 % -3.33'
-0.5099999999999998
$ fl7 '10.5 % -3.33'
0.5099999999999998
$ fl7 '10.5 - 3.33 * 3'
0.5099999999999998
レッスン7 無限大と非数
いくつかの数値を扱う演算では、入力次第で結果が無限大INFINITYや非数NANとなります。
$ fl7 '1 / 0'
INFINITY
$ fl7 '0 / 0'
NAN
$ fl7 '-1 / 0'
-INFINITY
fluorite-7では整数を整数の0で割ってもゼロ除算エラーにはなりません。
これらの値が直接欲しい場合は、INFINITY
やNAN
と記述します。
$ fl7 'INFINITY'
INFINITY
$ fl7 'NAN'
NAN
$ fl7 '-INFINITY'
-INFINITY
fluorite-7では未定義識別子は同内容の文字列になるので、これだけでは分かりませんね。
ではTYPE関数を先取りして「値の型」を見てみましょう。
$ fl7 'TYPE(INFINITY)'
NUMBER
$ fl7 'TYPE(NAN)'
NUMBER
$ fl7 'TYPE(-INFINITY)'
NUMBER
$ fl7 'TYPE(INFINITYYYYY)'
STRING
$ fl7 'TYPE(NaN)'
STRING
INFINITY
とNAN
だけが数値で、他は文字列として出力されていることが分かります。
まとめ
- 数値リテラルがある。
- 式を括弧で囲える。
- 符号・四則演算・剰余・べき乗ができる。
- 整数同士の
/
は小数になる。 - 前置演算子は中置演算子より優先される。
- 0除算はINFINITYやNANになる。