C++のテストデータをRubyで作っていたら1時間ぐらいハマったのでメモ
マイナスの値の割り算結果がC++とRubyでは違う。
divmod.cpp
#include <iostream>
int main(void)
{
std::cout << "10 / 3 = " << 10 / 3 << ", 10 % 3 = " << 10 % 3 << std::endl;
std::cout << "-10 / 3 = " << -10 / 3 << ", -10 % 3 = " << -10 % 3 << std::endl;
std::cout << "10 / -3 = " << 10 / -3 << ", 10 % -3 = " << 10 % -3 << std::endl;
std::cout << "-10 / -3 = " << -10 / -3 << ", -10 % -3 = " << -10 % -3 << std::endl;
std::cout << "11 / 3 = " << 11 / 3 << ", 11 % 3 = " << 11 % 3 << std::endl;
std::cout << "-11 / 3 = " << -11 / 3 << ", -11 % 3 = " << -11 % 3 << std::endl;
std::cout << "11 / -3 = " << 11 / -3 << ", 11 % -3 = " << 11 % -3 << std::endl;
std::cout << "-11 / -3 = " << -11 / -3 << ", -11 % -3 = " << -11 % -3 << std::endl;
return 0;
}
実行結果
10 / 3 = 3, 10 % 3 = 1
-10 / 3 = -3, -10 % 3 = -1
10 / -3 = -3, 10 % -3 = 1
-10 / -3 = 3, -10 % -3 = -1
11 / 3 = 3, 11 % 3 = 2
-11 / 3 = -3, -11 % 3 = -2
11 / -3 = -3, 11 % -3 = 2
-11 / -3 = 3, -11 % -3 = -2
divmod.rb
puts '10 / 3 = %d, 10 %% 3 = %d' % [ 10 / 3, 10 % 3, ]
puts '-10 / 3 = %d, -10 %% 3 = %d' % [ -10 / 3, -10 % 3, ]
puts '10 / -3 = %d, 10 %% -3 = %d' % [ 10 / -3, 10 % -3, ]
puts '-10 / -3 = %d, -10 %% -3 = %d' % [ -10 / -3, -10 % -3, ]
puts '11 / 3 = %d, 11 %% 3 = %d' % [ 11 / 3, 11 % 3, ]
puts '-11 / 3 = %d, -11 %% 3 = %d' % [ -11 / 3, -11 % 3, ]
puts '11 / -3 = %d, 11 %% -3 = %d' % [ 11 / -3, 11 % -3, ]
puts '-11 / -3 = %d, -11 %% -3 = %d' % [ -11 / -3, -11 % -3, ]
実行結果
10 / 3 = 3, 10 % 3 = 1
-10 / 3 = -4, -10 % 3 = 2
10 / -3 = -4, 10 % -3 = -2
-10 / -3 = 3, -10 % -3 = -1
11 / 3 = 3, 11 % 3 = 2
-11 / 3 = -4, -11 % 3 = 1
11 / -3 = -4, 11 % -3 = -1
-11 / -3 = 3, -11 % -3 = -2
C++は結果がマイナスになる割り算は0に近づくのに対して、
Rubyは反対方向に丸められる。
どちらも
a / b * b + (a % b) == a
はtrue。
(-a / b) * -1 == a / b
はRubyで割り算の結果が割り切れないときはfalse。
C++とRubyで割り算の結果が割り切れるときはtrue。
この違いが何によるものなのかは少し調べた限りでは分からなかった…