2005年11月30日

こんなプログラムはいやだ: 負の剰余

知人から次の式の計算結果はどうなるかという問題を出されました。

-3 %  5
 3 % -5
-3 % -5
 

降参して答えを尋ねたところ、問題を出した方も答えを知らないことがわかりました。そこで、いくつかの言語処理系で結果を調べてみました。手元の環境 (Intel Xeon 上の Debian GNU/Linux sarge) で調べると2つのグループに分かれました。

             C
(GCC 3.3.5)
Java
(Sun JDK 1.5.0_05)
PHP
4.3.10-16
Emacs
22.0.50.2
Ruby
1.8.2
Python
2.3.5
Perl
5.8.4
-3 % 5-3 -3 -3 -3 2 2 2
3 % -5 3 3 3 3 -2 -2 -2
-3 % -5-3 -3 -3 -3 -3 -3 -3

まとめ

負の数を含む % の計算結果は言語処理系によってまちまちのようですが、言語によっては明確に定義されています。Java の % の定義は言語仕様にあります。C言語でも C99 では Java と同様の式で定義されているようです。

謝辞

C99 で % の定義が明確化されたという指摘を鵜飼さんからいただきました。いつもありがとうございます。

C99 より前のコンパイラでも div_t div(int, int) という関数を使えば安心して Java と同じ計算結果が得られると光成さんからご指摘を受けました。情報ありがとうございます。