9

これらの式をPython3.3.0に入力すると、疑問が生じます。

-10 // 3  # -4
-10 % 3   #  2
10 // -3  # -4
10 % -3   # -2
-10 // -3 #  3

おおよその浮動小数点(-3.33)を取るように見えますか?整数除算ではどちらの方法でも切り捨てられますが、モジュロ演算ではまったく異なる動作をします。余り+/-1を返し、負のオペランドがどこにあるかに応じて符号を切り替えるだけのようです。このサイトで他の答えを見た後でも、私は完全に混乱しています!誰かが私もこれを明確に説明できることを願っています!この本にはヒントが書かれています。この魔法の公式a=(a // b)(b)+(a%b)を思い出してください。しかし、それは私にとって水をまったくきれいにしないようです。

-前もって感謝します!

編集:これらは(上記の)何が起こっているかについての私の個人的な評価にすぎません、私は知っています、私は完全にオフです!

4

4 に答える 4

7

そこにある整数除算は、最後に得られた数の下限をとっているだけです。

10/3  -> floor(3.33)  ->  3
-10/3 -> floor(-3.33) -> -4

(なぜ床になるのか)


一方、モジュロ演算は数学的な定義に従います。

于 2013-01-15T22:43:47.633 に答える
6
  • 魔法の公式:a = (a // b) * b + (a % b)
  • a: -10
  • b: 3
  • a // b: -4
  • a % b: 2

    魔法の公式に置き換える:-10 = -4 * 3 + 2 = -12 + 2 = -10

  • a: 10

  • b: -3
  • a // b: -4
  • a % b: -2

    魔法の公式では:10 = -4 * -3 - 2 = 12 - 2 = 10

したがって、魔法の公式は正しいようです。

a // bとして定義する場合floor(a / b)(それは)、でa % bある必要がありますa - floor(a / b) * b。どれどれ:

  • a: -10
  • b: 3
  • a % b = a - floor(a / b) * b = -10 - floor(-3.33) * 3 = -10 + 4 * 3 = 2

 

常に床に置かれているという事実a // bは非常に覚えやすいです(クトゥルフの最初のリンクを読んでください、それはPythonの作成者による説明です)。負aa % b数の場合..で始まり、列0を持つ数値のテーブルを想像してみてください。b

b = 3:

0  1  2
3  4  5
6  7  8
9 10 11
...

aがセル内の番号である場合a % b、は列番号になります。

a         a % b
_______________
0  1  2   0 1 2
3  4  5   0 1 2
6  7  8   0 1 2
9 10 11   0 1 2

次に、テーブルをネガに戻します。

   a          a % b
 __________________
-12 -11 -10   0 1 2
 -9  -8  -7   0 1 2
 -6  -5  -4   0 1 2
 -3  -2  -1   0 1 2
  0   1   2   0 1 2
  3   4   5   0 1 2
  6   7   8   0 1 2
  9  10  11   0 1 2

-10 % 3になります2。ネガティブaインa % bは、この種のコンテキストで発生します。a % bネガティブbはあまり出てきません。

于 2013-01-15T22:45:34.290 に答える
2

簡単なルール:a % b = c場合、cがゼロでない場合は、と同じ符号を持つ必要がありbます。

そして魔法の公式を適用します:

10 % -3 = -2=>10 // -3 = (10 - (-2)) / (-3) = -4

-10 % 3 = 2=>-10 // 3 = (-10 - 2) / 3 = -4

-10 % -3 = -1=>-10 // -3 = (-10 - (-1)) / (-3) = 3

于 2013-01-15T23:06:52.873 に答える
1

さて、私はいくつか掘り下げました。問題はPythonではなく、モジュロ関数だと思います。私はこの答えをhttp://mathforum.org/library/drmath/view/52343.htmlに基づいています

10%3 10未満の3の最大倍数を使用します。この場合、9。10-9 = 1

-10%3も同じことをします。それはまだ-10未満である3の倍数を探しています。この場合、-12。(-10)-(-12)= 2

于 2013-01-15T22:49:27.560 に答える