Lua入門 その2 — 数値

目次

Unknown programmer's programming note.

<2022-01-20 木>

1 何をするか

今回は簡単な数値の扱い方をやります。

今の段階でLuaを使ってできることは、print関数の引数に文字列を指定して、そのまま画面に表示させる、ということだけです。 一応、それでも画面一杯にお気に入りの詩や歌詞を表示させて楽しむことはできるでしょう。 しかし、書いたものがそのまま表示されるというだけでは、何度も繰り返していたら割とすぐに飽きてしまうのではないかと思います。

そこで、書いたもの単にそのまま表示されるだけではなく、何かしらLuaに処理をさせることによって、変化を加えたものを表示させることを試してみます。

文字列を加工して表示変化させることも可能です。 前回文字列を扱ったので、続けて文字列を扱うものを先に取り上げるのが妥当かもしれません。 ですが、Luaが表示できるのはテキストだけではなく、数値も表示できることを示すのと、守備範囲を広げるために数値を先に扱います。

2 2番目の問題

また問題を提示して、解決策を模索しながら話を進めていきます。

問題2 — 数値と四則演算

次の計算式の答えを画面に表示する。

  • 2 + 1
  • 8 − 5
  • 6 × 7
  • 9 ÷ 3

足し算、引き算、掛け算、割り算です。

2.1 作業場所の用意

前回作成した /home/toma/code/pintro というところに problem2 というディレクトリを作成することにします。

% cd ~/code/pintro⏎
% mkdir problem2⏎

念ため書いておくと、パスの先頭の ~ は、ホームディレクトリを意味します。 ユーザーがtomaの場合 /home/toma などに置き換えられます。

作成したディレクトリの中に移動します。

% cd problem2⏎
% pwd⏎
/home/toma/code/pintro/problem2

これで準備できました。

2.2 数値を画面に表示する

計算をする前に、画面に数値を表示するにはどうすればいいかを確認しておきます。 現在使える道具は、print関数だけです。 もし引数を数値にしたときどうなるかを実験してみます。

こうした動作確認のためにコードを走らせてみたい場合は、対話モードが便利です。 対話モードでLuaを起動するには、引数なしでlua54というコマンドを実行すれば良いのでした。

% lua54⏎
Lua 5.4.2  Copyright (C) 1994-2020 Lua.org, PUC-Rio
> ▋

試しに、printの引数に適当な数字を書いてみます。

> print(42)⏎
42 

そのまま表示されました。 どうもprint関数は、数値を引数に渡すことで、その値を画面に表示することもできるようです。

複数の数を引数として渡したらどうなるか試してみます。

> print(1 2 3)⏎
stdin:1: ')' expected near '2'

これはできないようです。 という訳ではなく、書き方が悪かっただけです。 カンマで区切って渡すことができます。

> print(1, 2, 3)⏎
1	2	3

3つとも表示されました。

print関数は、何個でも引数を取ることができます。 その引数は、文字列でも数値でも、混在させることもできます。 表示された数はタブ文字で区切られていて、やや間が広いように感じられるかもしれません。 残念ながらprint関数では、これを制御することはできません。

ここでちょっと追加の実験をしてみます。 もし、print関数の引数としてではなく、直に42とか入力したらどうなるでしょう。

> 42⏎
42

そのまま表示されました。

カンマで区切って複数個の入力も試してみます。

> 1, 2, 3⏎
1	2	3

こちらもprint関数に渡した場合と同じような表示になりました。 このように表示されるのは、対話モードの特別な機能です。 便利に使えるように、いちいちprint関数を通さなくても表示されるようになってます。 この方法で画面に表示できるのは対話モードだけです。 ファイルにコードを書く場合はできません。

対話モードで直に数値を入力できるようになったのは、Luaのバージョン5.3からです。 それより前のバージョンである、5.2や5.1では =42 のように、「=」を先頭に付けなければいけませんでした。

2.3 計算してみる

print関数で数値を表示できることは確認できました。 引き続き、対話モードで問題の四則演算の計算ができないかを試していきます。

2.3.1 足し算

まず、足し算です。 足し算には「+」を使います。

> 1 + 2⏎
3

期待通りではなかったでしょうか。

2.3.2 引き算

次に引き算を試してみます。 引き算には「-」を使います。

> 3 - 2⏎
1

これも期待通りではなかったでしょうか。 もし引き算の結果が0より小さくなった場合どうなるかも見ておきます。

> 2 - 5⏎
-3

負の数もちゃんと扱えるようです。

2.3.3 掛け算

次に掛け算です。 掛け算は「×」ではなく、「*」を使います。

> 9 * 8⏎
72

なぜ「*」が掛け算なのか理由は分かりません。 しかし、プログラミング言語の大半が「*」を掛け算として採用しています。 受け入れるしかありません。 慣れてしまえば違和感を感じることも、疑問に思うこともなくなるでしょう。

一応、負の数も計算できるか見ておきます。

> -9 * 8⏎
-72
> 9 * -8
-72
> -9 * -8
72

完璧です。

2.3.4 割り算

次は割り算です。 割り算は「÷」ではなく、「/」を使います。

> 10 / 5⏎
2.0

今度はちょっと「おや?」と思われるところがあります。 答えが2ではなく2.0となってます。

今度は割り切れない数で試してみます。

> 10 / 3⏎
3.3333333333333

どうやら「/」の割り算をすると、結果は小数として表示されるようです。

実は割り算にはもう一つの記号「//」があります。 こちらは、結果を小数とするのではなく、整数にしてしまいます。

> 10 // 5⏎
2
> 10 // 3⏎
3

10 // 3 の場合、「3余り1」のように考えられますが、余りは捨てられます。 というのは正確ではありません。 本当は、まず小数で割り算した結果を求めて、それに近い整数の小さい方に丸めます。 丸めるとは、切り詰めるような意味です。 「/」は float division 「//」は floor division という名前が付いています。 何と和訳すればいいのかよく分かりません。 とりあえず「/」は 浮動除算 「//」は 床除算 とでもしておきます。

負の数を床除算したときの結果には注意が必要です。

> -10 / 3⏎
-3.3333333333333
> -10 // 3⏎
-4

小さい方に丸められるので、-3ではなく-4となっています。

浮動というのが何を意味するかというと、Luaでは実数(大雑把には小数のことです)を表現するために 浮動小数点数; Floating Point Number というビット表現(内部フォーマット)を使用しています。 そして、浮動の意味は、ビット表現において小数点の位置が固定ではない、という意味です。 浮動小数点数と対称的なビット表現は、固定小数点数と言うものです。 固定の意味は、ビット表現において小数点の位置が固定である、という意味です。 ほとんどのプログラミング言語が、浮動小数点数の方を採用しています。 しかし、浮動小数点数のことを本当に理解するのは、困難を極めます。 今はこれ以上深入りしないことにします。

Lua 5.2までは、数値は全て浮動小数点数でした。 整数が導入されたのはLua 5.3からです。

2.4 解答

Luaで四則演算をどうやるか、大体の雰囲気は掴めたと思うので、問題に取り組んでみます。

今度はファイルにコードを書きます。

もし今まだ対話モードに入っているなら、まずCtrl+Dで対話モードを抜けます。

> ^D⏎
% ▋

テキストエディタでファイルを新規のファイルを開きます。 ファイル名は arithmetic.lua とでもしておきます。 viなら vi arithmetic.lua eeなら ee arithmetic.lua とします。

コードは次のようになります。

print(2 + 1)
print(8 - 5)
print(6 * 7)
print(9 / 3)

ファイルを保存してテキストエディタを終了します。

実行してみます。

% lua54 arithmetic.lua⏎
3
3
42
3.0

このようになればクリアです。

3 まとめ

今回はだいぶ簡単な内容だったのではないかと思います。

  • Luaでは、足し算、引き算、掛け算、割り算ができる。
    • 足し算「+」
    • 引き算「-」
    • 掛け算「*」
    • 割り算には、浮動除算「/」と床除算「//」の2種類がある。
  • print関数の引数に数値を渡すと、その値を画面に表示することができる。
  • 対話モードでは、print関数を使わなくても、プロンプトに続けて直接数値や計算式を入力すれば、その値を画面に表示することができる。

次はもうちょっと実用的な計算をやってみます。

著者: watercat

Created: 2023-03-19 日 01:34

Emacs 27.1 (Org mode 9.3)

Validate