元ネタ
http://python-history-jp.blogspot.com/2010/09/pythonc.html
Pythonのこの挙動、知らなかった。
print -1 / 3 # -1 print -1 % 3 # 2
C++なら、
std::cout << -1 / 3 << std::endl; // 0 std::cout << -1 % 3 << std::endl; // -1
何度この挙動に悩まされただろうか。数論ではもちろん、よくある計算でもうまくいかない。例えば、角度(degree)を0°〜360°([0, 360))に正規化したいとする。Pythonなら、
print -30 % 360 # 330
C++なら、
std::cout << -30 % 360 << std::endl; // -30
ダメですね。こんな風にしないと。
int normalize_angle(int deg) { int tmp_deg = deg % 360; if(deg < 0) return deg + 360; else return deg; } int main() { std::cout << normalize_angle(-30) << std::endl; // 330 }
元ネタ見ていたらもっと簡単な事例を思い出した。1時の2時間前は? (1 - 2) % 24 → 23時。
この仕様でよかったと思った記憶がまったくないんですが、なぜこうなってるんでしょうね。大昔、演算器を作るときこのほうが都合がよくて、今さらこれを直すこともできない、ということでしょうか。
あ、ネタ元に書いてあるね。