9

私は、MATLAB を広範囲に使用した Python 初心者です。MATLABで使用するコードを変換していてlog2、NumPylog2関数を使用したところ、このような小さな数に対して予想していたものとは異なる結果が得られました。数値の精度は同じでなければならないので驚きました (つまり、MATLAB double と NumPy float64)。

MATLAB コード

a = log2(64);

--> a=6

ベース Python コード

import math

a = math.log2(64)

--> a = 6.0

NumPy コード

import numpy as np

a = np.log2(64)

--> a = 5.9999999999999991

修正された NumPy コード

import numpy as np

a = np.log(64) / np.log(2)

--> a = 6.0

そのため、ネイティブの NumPylog2関数は、数値が 2 のべき乗であることを確認しているため、コードがテストに失敗する原因となる結果を返します。期待される結果は正確に 6 であり、ネイティブの Pythonlog2関数と変更された NumPy コードの両方が、対数の性質。log2NumPy関数に何か問題がありますか? 今のところネイティブの Python を使用するようにコードを変更しましたlog2が、答えを知りたかっただけです。

4

1 に答える 1

7

いいえ、コードに問題はありません。それは、コンピューターで浮動小数点を完全に表現できないからです。float 値をチェックする際は、常にイプシロン値を使用して、一定範囲のエラーを許容してください。詳細については、浮動小数点ガイドこの投稿をお読みください。

編集- cgohlkeがコメントで指摘したように、

numpy のビルドに使用されるコンパイラに応じて、np.log2(x) は C ライブラリによって計算されるか、1.442695040888963407359924681001892137*np.log(x) として計算されます。このリンクを参照してください。

これが誤った出力の原因である可能性があります。

于 2013-07-17T14:10:10.190 に答える