web-dev-qa-db-ja.com

Pythonのべき乗-math.powとmath.sqrtの代わりに**演算子を優先すべきですか?

私の分野では、いくつかの数値を二乗し、それらを一緒に操作し、結果の平方根を取ることが非常に一般的です。これは、例えばピタゴラスの定理とRMS計算で行われます。

Numpyでは、次のことを行いました。

result = numpy.sqrt(numpy.sum(numpy.pow(some_vector, 2)))

そして、純粋なpythonでは、次のようなことが期待されます:

result = math.sqrt(math.pow(A, 2) + math.pow(B,2)) # example with two dimensions.

しかし、私はこの純粋なpythonフォームを使用してきました。これは、はるかにコンパクトで、インポートに依存せず、一見同等のフォームだからです。

result = (A**2 + B**2)**0.5   # two dimensions
result = (A**2 + B**2 + C**2 + D**2)**0.5

**演算子は一種のハックであり、0.5で累乗することで数を二乗することはそれほど読みにくいと主張する人がいると聞きました。しかし、私が尋ねたいのは次の場合です:

「3つ目よりも前の2つを好む計算上の理由はありますか?」

読んでくれてありがとう!

56
heltonbiker

ベースPythonでも、一般的な形式で計算を行うことができます

result = sum(x**2 for x in some_vector) ** 0.5

x ** 2は確実にハックではなく、実行される計算は同じです(cpythonソースコードで確認しました)。実際、私はそれがより読みやすい(そして読みやすさが重要だ)と感じています。

代わりにx ** 0.5を使用して平方根を取得しても、前者(おそらく)は対数を使用して計算され、後者は(おそらく)数学の特定の数値命令を使用して計算されるので、math.sqrtとまったく同じ計算を行いませんプロセッサ。

x ** 0.5をよく使用するのは、単にそのためにmathを追加したくないからです。ただし、平方根の特定の命令は、対数を使用したマルチステップ操作よりも(より正確に)動作することを期待しています。

16
6502