負数の割り算がおかしい
今日職場で使っていて気づいたんだけど、Rubyだけおかしくない?
1.8系も1.9系も同じ結果。
これってRubyの常識?
$ irb irb(main):001:0> 100/-9 => -12 irb(main):002:0> 100%-9 => -8 irb(main):003:0> -100/9 => -12 irb(main):004:0> -100%9 => 8
いくらなんでも余りが8はおかしいような。
ちなみにScheme
$ gosh gosh> (quotient 100 -9) -11 gosh> (remainder 100 -9) 1 gosh> (quotient -100 9) -11 gosh> (remainder -100 9) -1
ついでにCでも
$ cat test.c #include <stdio.h> int main(void){ printf("%d %d\n", 100/-9, 100%-9); printf("%d %d\n", -100/9, -100%9); return 0; }
$ ./test -11 1 -11 -1
CとScheme(Gauche)は結果が同じ。
Rubyだけ違う。RubyはCで書かれているから計算結果はCと同じと思っていたのに。
風邪でしんどいから今日はここまで。
追記:
だれか理由を知っている人がいたら教えてください。
追記2:
1.9のnumeric.cより。
これが割り算を行う実際の関数らしい。
static void flodivmod(double x, double y, double *divp, double *modp) { double div, mod; #ifdef HAVE_FMOD mod = fmod(x, y); #else { double z; modf(x/y, &z); mod = x - z * y; } #endif div = (x - mod) / y; if (y*mod < 0) { mod += y; div -= 1.0; } if (modp) *modp = mod; if (divp) *divp = div; }
この中の
if (y*mod < 0) { mod += y; div -= 1.0; }
が該当部分なんだけど、普通に計算すれば良いものを意図的に計算結果を変えている。
理由は不明。