2016-11-30 8 views
0

大きなプロジェクトの一部として、+1の線形パターンではなく、波長タイプのパターンでいくつかの値を変更したい。Pythonの正弦波計算における予期しない/望ましくない結果

明らかに、これらの値をグラフやその他のものにプロットしようとは思わない...これらの値を使用して、私のラズベリーパイを介して色の濃さを調整したい。

とにかく、手の甲で問題に...

私は次のPythonスクリプトがあります。

#!/usr/bin/python 
from math import * 
Fs=8000 
f=500 
i=0 
while i<50: 
    print (sin(2*pi*f*i/Fs)) 
    i+=1 

私に次のような出力(切り捨て)が得られる:

0.0 
0.382683432365 
0.707106781187 
0.923879532511 
1.0 
0.923879532511 
0.707106781187 
0.382683432365 
1.22464679915e-16 
-0.382683432365 
-0.707106781187 
-0.923879532511 
-1.0 
-0.923879532511 
-0.707106781187 
-0.382683432365 
-2.44929359829e-16 
0.382683432365 
0.707106781187 
0.923879532511 
1.0 

をご覧のように、何度でも価値があります。

1.22464679915e-16 

-2.44929359829e-16 

3.67394039744e-16 

-4.89858719659e-16 

2.38868023897e-15 

-7.34788079488e-16 

なぜこれらの奇妙な結果が得られますか?どのように私はこれらの出口価値を回避するのですか?私は間違って何をしていますか?

+0

おそらく "pi"定数は浮動小数点数です:https://en.wikipedia.org/wiki/Floating_point – Welbog

+1

これらの値は「出て行く」ものではなく、ほぼ0.0に近い値です。それらが正確にゼロでない理由は[浮動小数点は常に正確ではありません](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)です。 –

+0

丸めノイズで最後のビットを切り捨てるには、範囲(50)の 'for i:print(16 + sin(2 * pi * f * i/Fs))-16 'を使用します。 – LutzL

答えて

1

これらの値は、 "ウェイアウト(way-out-there)"ではありません。 Pythonは、典型的には53ビットの精度を有する。このため

https://docs.python.org/2/tutorial/floatingpoint.html

バイナリ表現は、あなたの正弦関数にゼロに対応する値で見ているためである〜1E-16、に対応します。