9

Pythonに剰余演算子はありますか? モジュロ演算子は求めませんが、剰余です。例えば:

-5 mod 2 = 1

しかし

-5 rem 2 = -1 # where "rem" is a remainder operator.

自分で実装する必要がありますか ;)?

4

3 に答える 3

22

「モジュロ」または「剰余」には、実際には 2 つではなく、3 つの異なる定義があります。

  • 切り捨てられた除算の剰余: 符号は被除数と同じです。
  • 床除算剰余: 符号は除数と同じです。
  • ユークリッド除算の剰余: 符号は常に正です。

それらの 1 つを「モジュロ」と呼び、別の「剰余」と呼ぶのは非常に紛らわしいです。これら 3 つすべてが、両方の用語の有用な定義です。

ほとんどすべての言語は、3 つのうちの 1 つしか提供しません (Fortran は顕著な例外です) 。* ほとんどの言語は、言語の除算演算子に一致するものを提供します。**一致剰余演算子を使用します。

他のいずれかが必要な場合は、手動で記述する必要があります。それほど難しいことではありません。このウィキペディアの記事では、3 つすべてを実装する方法を示しています。

例えば:

def trunc_divmod(a, b):
    q = a / b
    q = -int(-q) if q<0 else int(q)
    r = a - b * q
    return q, r

さて、あなたの例では:

>>> q, r = trunc_divmod(-5, 2)
>>> print(q, r)
-2 -1

* 多くの場合、呼び出しの切り捨てられた剰余のいくつかのバリエーションとmod、いくつかのバリエーションの床の両方を提供する言語rem…しかし、それは間違いなく依存するものではありません. たとえば、Fortran は floored剰余 を呼び出しますがmodulo、Scheme は Euclidean剰余 を呼び出しますmod

** 2 つの注目すべき例外は C90 と C++03 であり、どちらを選択するかは実装に任されています。多くの実装では切り捨てられた除算と剰余を使用しますが、そうでないものもあります (切り捨てられた除算と切り捨てられた剰余を使用する実装もいくつかあります。つまり、a = b * (a/b) + a%b機能しません…)。

于 2013-08-28T22:53:47.057 に答える
2

編集:剰余演算を要求したときに何を意味したかは完全には明確ではありません。これを行う方法は、出力の符号にどのような要件があるかによって異なります。

サインが常に正である場合は、必要なdivmodことを行うことができます。それは標準ライブラリにあります

http://docs.python.org/2/library/functions.html#divmod

また、組み込みの二項算術演算子を確認することもできます。

http://docs.python.org/2/reference/expressions.html

残りが渡された引数と同じ符号を持つ必要がある場合は、次のように自分でロールする必要があります。

import math
def rem(x,y):
    res = x % y
    return math.copysign(res,x)
于 2013-08-28T22:42:42.397 に答える