切捨て御注意 | 悪態のプログラマ

悪態のプログラマ

とある職業プログラマの悪態を綴る。
入門書が書かないプログラミングのための知識、会社の研修が教えないシステム開発業界の裏話は、新人プログラマや、これからプログラマを目指す人たちへのメッセージでもある。

プログラミングをしていて、簡単な数値の計算が予想外の結果になってしまって、驚いたことはないだろうか?


5 を 2 で割ったらいくつになるか?

もちろん、2.5 であるが、これは実数での計算だ。C言語で int と表現されるような「整数型」の計算では、小数点以下は扱えない。そこで、少数点以下は切り捨てて計算される。例えば、5 ÷ 2 なら、2 になるのである(※1)。

ここまではよいだろう。では、-5 ÷ 2 ではどうなるか?

-2.5 の小数点以下が切り捨てられて -2 になる? しかし、切り捨てたら値は小さくなるはずなので、-3 になる、という考え方もある。


整数の割り算は、いわゆる「商と余り」を求めることでもある。身近な(?)2つの電卓プログラムで、-5 を 2 で割った「余り」を計算させ、切捨て方法の違いを体験してみた。

まず、Windows XP 付属の電卓で "-5" → [Mod] → "2" とやってみた。-1 が返ってきた。

  -5 ÷ 2 = -2 … -1 (商 = -2、余り = -1)

ということである。

次に、「Google 電卓機能」で、「-5 % 2」を求める と、答えは 1 だという。

  -5 ÷ 2 = -3 … 1 (商 = -3、余り = 1)

ということだろう。


プログラマとして認識しておきたいのは、このような基本的な計算ですら、処理系(プログラミング言語など)によって動作が違うことがある、ということである(※2)

初めて使う言語は、コードの書き方の違い、ライブラリの違いなどは大いに気にすると思う。しかし、こうした、演算仕様の違いなどには、意外と気が及ばないものだ。

ちょっとしたプログラムを書いて動かしてみれば確認できることなので、今使っている言語ではどうなのか、調べてみるといいだろう。




※1
詳しく調べていないが、切り捨てないで、例えば四捨五入のような「丸め込み」をする言語(処理系)もあるかもしれない。

また、型に厳密でない言語では、整数同士で割り算をしても、「答えの型」が勝手に実数になってしまうことも多い。このような場合、例えば、(5 / 2) * 2 + (5 % 2) が 5 にならない というように、意図しないことが起こる場合があるので注意。

※2
ちょっと手元で試しただけでも、Java では -5 / 2 は -2 だが、Ruby では -3 だった。-5 % 2 については、Java は -1、Ruby は 1 を返した。同じ処理系内では、商と余りの関係に一貫性があるようだ。ただし、Ruby では、(-5/2) が -3 である一方、(-2.5).to_int が -2 となった。



■関連記事
五捨五入
ゼロ除算についてあらためて考える



Excelで学ぶやさしい数学―三角関数から微積分まで
高橋 幸久 渡辺 八一
オーム社 (2004/01)
売り上げランキング: 141,472


プログラマの数学
プログラマの数学
posted with amazlet on 06.04.03
結城 浩 結城 浩
ソフトバンククリエイティブ (2005/03/24)
売り上げランキング: 4,427
おすすめ度の平均: 4
4 文系の方向けの良書
4 文系プログラマにはよい
4 「情報工学をかじったことのないプログラマ」向けの本