見出し画像

プログラミング言語における小数の書き方

プログラムを書く時に普通に数値を書くのであれば、日常生活と同じように1.5であるとか、3.14と書けば、思ったように使えるはずです。

コンピュータの内部では10進数ではなく2進数に変換されて処理されるというのは、どこかで聞いたことがあるかもしれませんが、小数は浮動小数点数という形式に変換されて処理されます。

10進数であれば、小数点以下第1位は10分の1の桁、第2位は100分の1の桁というようになっていますが、同じように2進数でも2分の1の桁、4分の1の桁というように表現した値になります。ここで「浮動」というのは、小数点の位置が「固定」されている表現で、どんな値であっても整数の部分を1桁として表し、その1桁目が実は何桁目になるんだよという表し方をします。例えば100は、1.0✕10の2乗ですし、0.001は1.0✕10の-3乗です。これを2進数で表現するので、内部的には2の何乗という形になります。

浮動小数点数

細かいところは置いておくとして、これをリテラルで表現するには、100の代わりに1.0e2、0.001の代わりに1.0e-3と書いても同じ値になるのです。eの代わりに大文字のEでも同じです。

ここまでは素直なのですが、リテラルには型を示す文字を追加できるので、ちょっとややこしくなります。C言語であれば小数点があるときに何もつかなければ倍精度型(double)であると解釈され、最後にFをつければ単精度型(float)と解釈されます。ここもfでも大丈夫です。これは基本的にはJavaでも同じです。この先が少しややこしいのですが、JavaはDをつけて倍精度であることを明示することもできるようです。またCには倍々精度型(long double)があるので、こちらはLを使います。

ややこしいですね。この指定をいい加減に書くと、3.14159265358979323846と一生懸命に書いて long doubleに値を設定してもLが付いていないので、いったんdoubleに丸められてしまい意味がなくなったりします。

この辺りの書き方は言語によって結構違いがあって、VB.NETでは、Dをつけると通貨型という固定小数点の特殊な型であると解釈され、倍精度にしたいときにはRを使います。そして古のBASICでは、単精度は!、倍精度は#をつけるのですが、倍精度を指定するのに指数を指定するEの代わりにDを使うこともできます。1.2D12と書けば倍精度です。ちょっと変わったところでは、1未満の数を書く時に先頭の0を省略して.15と書いても構わないことくらいです。

詳しくはそれぞれの言語のリファレンスを見てもらうしか無いのですが、リテラルの型指定って、割と目立たないところにあったりします。

ちょっと面倒でいやらしい話としては、これらのリテラルの書き方が入出力においても働くことがあります。もちろんプログラムでの処理の仕方次第なのですが、数値を入力するテキストボックスなどに1.58とか書くのではなく1.5e15なんて書くと、特にエラーとならずにものすごく大きな数として解釈されることがあります。きちんと最大値のチェックとかがなされていれば良いのですが、あまり大きな数を書くと続けて他のエラーが発生してグダグダになってしまうことがあるんですね。そしてこういう極端な数を表示するときも急に1.58623e48とかいう文字列になってしまい、書式が崩れたり、そもそも読む人が意味がわからないということにもなりかねません。理系の人であれば気がつくかもしれませんけどね。

プログラミングの世界って、実は大部分は整数で事足りので小数を使うときの配慮を忘れがちです。今は相当大きな値までを整数で扱えますし。日本以外ではお金の計算が小数になるので、それなりに使うのですが、その場合でも誤差を嫌って100倍にした整数を使うこともあるようです。浮動小数点数を使うと誤差にも配慮しなければならず、うっかり等号比較もできないのですが、そんなことをすっかり忘れているコードに出会うことも度々です。

#小数 #浮動小数点数 #C言語 #Java #VB #BASIC #リテラル #型指定

この記事が気に入ったらサポートをしてみませんか?