fluorite-7　日本語チュートリアル　Part 2　算術の基礎


[チュートリアルトップ](https://qiita.com/MirrgieRiana/items/a0906c72ebfb46693ab5)

[←前回](https://qiita.com/MirrgieRiana/items/3cbbdbb9f125e31e9fbb)　[次回→](https://qiita.com/MirrgieRiana/items/3aed3a6a03da28c48dae)

このパートでは、数値の基本的な扱い方法について扱います。

# レッスン1　数値リテラル

`0`から`9`までの数字の塊は**整数リテラル**です。

```bash:
$ fl7 '123456'
123456
```

先頭が0で始まっても10進数です。

```bash:
$ fl7 '0123456'
123456
```

ピリオド`.`が1個数字列の間に挟まった数字の塊は**小数リテラル**です。
小数リテラルは浮動小数点数を生み出します。

```bash:
$ fl7 '00003.140000'
3.14
```

末尾に`e`もしくは`E`に続いて整数が書かれたものは**指数リテラル**です。
指数リテラルも浮動小数点数を生み出します。

```bash:
$ fl7 '00003.140000E100'
3.14e+100

$ fl7 '00003.140000e-100'
3.14e+-00

$ fl7 '00003.140000e+000100'
3.14e+100
```

# レッスン2　丸括弧

**括弧演算子**`(` `)`は、囲んだ内部のひとまとまりの式を表します。
括弧演算子は式の区切りを明確にするだけで、（この時点では）特別な効果は何も効果はありません。
式の区切りを与える効果はしばしば「先に計算する」のように表現されます。

```bash:
$ fl7 '(00003.140000)'
3.14
```

括弧演算子は同じ対象に好きなだけ大量に書けます。

```bash:
$ fl7 '(((((00003.140000)))))'
3.14
```

# レッスン3　符号

前置`+`および`-`は**符号**の演算子です。

`+`は数値に対しては特に何もせず、`-`は数値を負にします。

```bash:
$ fl7 '+00003.140000'
3.14

$ fl7 '-00003.140000'
-3.14
```

符号は数値リテラル以外に対しても書けます。
その場合も効果は概ね変わりません。

```bash:
$ fl7 '-(00003.140000)'
-3.14

$ fl7 '-(-(00003.140000))'
3.14
```

符号は同じ対象に大量に書けます。

```bash:
$ fl7 '+-++-+---+--++-+-++--+-00003.140000'
3.14
```

この場合、符号列の右から順に効果を適用します。
数値の3.14に対してまず`-`で符号を反転させ、次に`+`で何もせず、2連続の`-`の効果で符号を2回逆転させ、以降同様の処理を残りの全ての符号に対して適用します。

# レッスン4　四則演算

中置`+` `-` `*` `/`演算子は、それぞれ**加算**・**減算**・**乗算**・**除算**です。
整数同士の除算は小数になります。

```bash:
$ fl7 '1 + 2'
3

$ fl7 '1 - 2'
-1

$ fl7 '1 * 2'
2

$ fl7 '1 / 2'
0.5
```

演算子には結合の優先度があり、乗除算は加減算よりも先にまとまります。

```bash:
$ fl7 '1 + 2 * 10'
21

$ fl7 '1 + (2 * 10)'
21

$ fl7 '(1 + 2) * 10'
30
```

また、四則演算においては、同じ結合優先度の演算子同士は左から順にまとまります（左優先結合）。

```bash:
$ fl7 '1 - 2 - 3'
-4

$ fl7 '(1 - 2) - 3'
-4

$ fl7 '1 - (2 - 3)'
2
```

# レッスン5　べき乗

fluorite-7では、**べき乗**を中置`^`で表現します。

```bash:
$ fl7 '2 ^ 8'
256
```

べき乗演算子は乗除算演算子よりも結合優先度が高く、かつ右優先結合です。

```bash:
$ fl7 '10 * 2 ^ 2 ^ 3 * 10'
25600

$ fl7 '10 * (2 ^ (2 ^ 3)) * 10'
25600
```

fluorite-7では、すべての前置演算子は、すべての中置演算子よりも結合優先度が高いです。
これはべき乗よりも符号が優先されることを意味します。

```bash:
$ fl7 '-2 ^ 4'
16

$ fl7 '(-2) ^ 4'
16

$ fl7 '-(2 ^ 4)'
-16
```

これは数学の式や他のいくつかの言語と異なり、Excelと似ています。

```bash:
$ perl -E 'say -2 ** 4'
-16
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/6e1dd3c9-7b0c-0192-fba9-a0ab9fb9554e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/51467c71-ada4-1ded-30d1-e11f446428af.png)

# レッスン6　剰余

中置`%`は**剰余演算子**です。
剰余演算子は乗除算演算子と同優先度です。
細かい仕様はJavaScriptの同演算子に従います。

```bash:
$ 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となります。

```bash:
$ fl7 '1 / 0'
INFINITY

$ fl7 '0 / 0'
NAN

$ fl7 '-1 / 0'
-INFINITY
```

fluorite-7では整数を整数の0で割ってもゼロ除算エラーにはなりません。

----

これらの値が直接欲しい場合は、`INFINITY`や`NAN`と記述します。

```bash:
$ fl7 'INFINITY'
INFINITY

$ fl7 'NAN'
NAN

$ fl7 '-INFINITY'
-INFINITY
```

fluorite-7では未定義識別子は同内容の文字列になるので、これだけでは分かりませんね。
ではTYPE関数を先取りして「値の型」を見てみましょう。

```bash:
$ 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になる。

# Part 3

[次回→](https://qiita.com/MirrgieRiana/items/3aed3a6a03da28c48dae)