Swift Playgroundsで学ぶiOSプログラミング

10÷4=2の謎、Swiftで数値の種類を使い分ける

文●柴田文彦 編集●吉田ヒロ

2016年08月22日 17時00分

 このような現象の根っこにあるのは、前回に見たように、三角関数には小数点の付いた数字を与えないとエラーになることと同じです。ここでも、小数点の付いた数字を計算させれば、結果は期待したものとなります。この場合、式の中に1つでも小数点が付いた数字があればいいという点にも注意してください。

「10/3.0」や「10.0/4」のように、小数点の付いた数を含む計算は期待通りの結果になります

整数と浮動小数点数

 前回の最後にも少し触れましたが、コンピューターで扱う数値には、大きく分けて2種類があります。これまでの実験からも明らかなように、小数点の付いていない数字と、付いている数字です。言うまでもなく、前者は初歩の数学にも出てくる「整数」です。後者は、数学ではたまたま小数点以下のない整数も含めて「実数」という語を使いますが、プログラミングの世界ではそうは言わず、「浮動小数点数」と呼ぶのが普通です。浮動小数点というのは、「小数点の位置が自由に移動する」といった意味ですが、これについては今は説明しません。

 整数と浮動小数点数は、コンピューター内部での表現方法がまったく異なります。いったん整数として記憶された数字は、その値が変わっても、いつまでたっても整数のままです。「10/3」が「3」になったのもそのためです。小数点以下が切り捨てられているのです。

 なぜ数値を整数と浮動小数点数に分けて扱うのかと言えば、それぞれ適した用途が異なるからです。整数は、ものの数を数えたりするのに適しています。正確ですが、扱える値の範囲が限られています。Swiftで扱える一般的な整数の最大値は「9223372036854775807」となっています。これが大きいか小さいかは、何を数えるかによって違うでしょう。これより1でも多ければエラーとなります。

Swiftで扱える整数の最大値は「9223372036854775807」です

 逆に最小値は「-9223372036854775808」となっています。実はSwiftには、符号のない、つまり正の数だけでマイナスの範囲のない整数というのもあり、その場合の最小値は「0」、最大値は「18446744073709551615」となっています。

 浮動小数点数は、整数よりも扱える数の大小の範囲はずっと広いのですが、整数と違って不正確な場合があります。これは表現できる数字の桁数に制限があるからです。桁数とは、電卓の表示の桁数と同じように、数字を何桁並べられるかということです。桁数に制限があるのに整数よりも大きな数や小さな数を表現できるのは、10の何乗という指数による表現を導入しているからです。一般の電卓では、指数を扱うことはできませんが、関数電卓と呼ばれるものには扱えるものがあることをご存知の方も多いでしょう。

数値と「型」

 整数と浮動小数点数のようなコンピューターで扱う数値の種類のことを「型」または「タイプ(type)」と呼んでいます。型にはそれぞれ名前が付いています。Swiftでは整数は「Int」という名前で呼ばれます。これは「整数」を表す「Integer」を短くしたものです。C言語やJavaなど、ほかの多くの言語では全部小文字で「int」というのが一般的ですが、Swiftではあくまで最初の文字だけを大文字にした「Int」です。「int」では誤りになるので注意してください。

 Swiftの浮動小数点数には、実は2種類があります。型の名前で言えば「Float」と「Double」です。前者は「浮動小数点数」を意味する「Floating Point Number」の略だとわかりますが、後者のダブルとは何が2倍なのでしょうか。これは実は「Double Precision Floating Point Number」の略です。日本語では「倍精度浮動小数点数」ということになります。これはFloatに比べて精度が2倍の浮動小数点数なのです。Swiftでは、むしろDoubleのほうが標準で、小数点付きの数字をいきなり書くと、Doubleだと見なされます。

 Floatは、コンピューター内部では32ビット、Doubleは64ビットを使って表現されます。バイト数で言えば、Floatは4バイト、Doubleは8バイトの容量を占めるわけです。DoubleはFloatに比べて必要なメモリーの容量も2倍になりますが、現在のコンピューターでは、その程度の容量の違いは問題にならない用途がほとんどです。

 FloatとDoubleの精度の違いを確かめるには、次回に取り上げる「変数」を使って実験する必要があります。数値の型は、特に変数として扱う場合に重要です。そのため、変数を使う際には、いちいち型を指定することができます。数値「3.0」のルート(平方根)を、FloatとDoubleで求めると、それぞれ「1.732051」と「1.732050807568877」になります。桁数で言えば、前者は7桁、後者は16桁あることがわかります。変数については次回に詳しく説明するので、今は意味がわからなくても気にしないでください。

Float型の数の桁数は7、Double型では16であることがわかります

 これを見ても明らかなように、Floatでは一般的な電卓以下の精度しかなく、計算の誤差が大きいことになります。Swiftの標準がDoubleになっているのはそのためですが、用途によってはDoubleでも精度が十分ではない場合もあるということは覚えておいてください。特にお金の計算などには浮動小数点数は使えません。

次回の予定

 すでに予告したように、次回は「変数」について説明し、実際にプログラムの中で使っていきます。通常のプログラミングは、ほとんどが変数を対象としたもので、生の数字をそのまま扱う部分はむしろ少ないのです。

mobileASCII.jp TOPページへ

mobile ASCII

Access Rankingアクセスランキング