kazayomi::lua::0005

数値いじりを深めてみない?


<-Prev(0004) [0005] Next(0006)->

前回、データの入物である、変数について触れましたが、
今回は、その中身になるデータの一種、数値について学んでみます。

変数の中に入るデータのことを、値(value)といい、
値を性質ごとに分類して、型(type)と呼びます。

C言語を代表とする多くのコンパイル型の言語は、変数が型を持ちますが、
LuaやPerlなどのスクリプト向けの言語は、変数は型を持たずに、
値自身が型を持つだけです。

簡単に言えば、Luaの変数は、難しい制約ぬきで、何でも代入できるってことです。
この前は、変数の中に、数字を入れて、四則演算して画面に表示しただけですが、
このような、数字のデータのことを、数値型(number)、あるいは実数型(real number)と呼びます。

それでは、数値を使って、色々いじってみましょう。

[number.lua]
1
2
3
4
5
print("1 = " .. 1)
print("1.0 = " .. 1.0)
print("1/3 = " .. 1/3)
print("3 * 2 + 5 * 0 = " .. 3 * 2 + 5 * 0)
print("3 * (2 + 5) * 0 = " .. 3 * (2 + 5) * 0)

すると、こういう実行結果が得られます。
1 = 1
1.0 = 1
1/3 = 0.33333333333333
3 * 2 + 5 * 0 = 6
3 * (2 + 5) * 0 = 0

くどいですけど、解説します。
1行目 : 整数の1は、もちろん数値の1です。
2行目 : 1を1.0と表記しても、同じこと。つまり、Luaは整数か少数かなんか、区別してません。
3行目 : 分数(というか除算の結果)は少数です。分数型なんてないので、誤差が生じてしまいます。
4行目 : 四則演算には、ちゃんと順番があります。
5行目 : 丸括弧内は、もちろん優先順位が高いです。でも、[]とか{}は括弧として使えません。

予想通りの結果だと思います。
ところで、数学でやっちゃいけないことの1つ、ゼロ除算は、どうなるでしょう?

[number2.lua]
print("1/0 = " .. 1/0)
print("-1/0 = " .. -1/0)
print("1/(-0) = " .. 1/(-0))
print("0/0 = " .. 0/0)

ドキドキ。怒られるかなー!?

実行結果
1/0 = inf
-1/0 = -inf
1/(-0) = inf
0/0 = nan

うぎゃー。なんじゃこりゃ。
1行目 : エラーが出るとおもいきや、数字じゃないです。
infはinfinityの略で、無限大になっちゃうみたいです。
2行目 : マイナス無限大。そりゃそうか。
3行目 : 正の無限大。正負に関わらず、ゼロで割れば無限倍として計算される模様。
4行目 : 更に見覚えの無い表示。not a numberの略で、こりゃ既に数じゃない。

次回はもっと、数値をいじり倒そう。

<-Prev(0004) [0005] Next(0006)->