整数同士の除算

元ネタ
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時。
この仕様でよかったと思った記憶がまったくないんですが、なぜこうなってるんでしょうね。大昔、演算器を作るときこのほうが都合がよくて、今さらこれを直すこともできない、ということでしょうか。
あ、ネタ元に書いてあるね。