5

私は少し問題を抱えています、見てください:

>>> import math
>>> math.sin(math.pi)
1.2246467991473532e-16

これは私が微積分のクラスで学んだことではありません (実際には 0 でした)

だから、今、私の質問:

Python で重い三角関数を実行する必要があります。正しい値を取得するためにどのライブラリを使用できますか?

10 進数を使用できますか?

編集:

申し訳ありませんが、私が意味するのは別のことです。

私が欲しいのは、いくつかの方法です:

>>> awesome_lib.sin(180)
0

またはこれ:

>>> awesome_lib.sin(Decimal("180"))
0

優れた三角関数計算を実行するライブラリが必要です。sin 180° が 0 であることは誰もが知っています。それができるライブラリも必要です。

4

5 に答える 5

15

1.2246467991473532e-16は 0 に近いです -- 小数点と最初の有効桁の間に 16 個のゼロがあります -- 3.1415926535897931(の値math.pi) が pi に近いのと同じです。正解は小数点以下16桁まで!

したがって、0 にしたい場合はsin(pi)、適切な小数点以下の桁数に丸めるだけです。15 は私には良さそうに見え、どんなアプリケーションにも十分なはずです。

print round(math.sin(math.pi), 15)
于 2012-06-01T16:42:40.643 に答える
12

Pi は無理数なので、有限数のビットを使用して正確に表すことはできません。ただし、sympyなどのシンボリック計算用のライブラリを使用できます。

>>> sympy.sin(sympy.pi)
0

質問の2番目の部分に関して、ラジアンの代わりに度を使用したい場合は、単純な変換関数を定義できます

def radians(x):
    return x * sympy.pi / 180

次のように使用します。

>>> sympy.sin(radians(180))
0
于 2012-06-01T16:45:17.263 に答える
7

予想外の結果が得られた場合は、次のテキストをご覧になることをお勧めします。 すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

それは本当に価値があります。

于 2012-06-01T16:50:09.637 に答える
0

gmpy または real を試すこともできます

gmpy では、精度を明示的に指定できます。

    gmpy.pi(256) 

real.py では、pa() 関数を使用できます。

    from real import pa,pi
    pa(pi)
于 2012-06-01T17:06:28.493 に答える