2016-11-30 7 views
0

큰 프로젝트의 일부로 +1 선형 패턴이 아닌 웨이브 길이 유형 패턴의 일부 값을 변경하고 싶습니다.Python에서 사인파 계산시 예기치 않은/원치 않는 결과가 발생했습니다.

분명히하기 위해 그래프 나 그 밖의 것들에 이들을 그려보기를 원하지는 않습니다 ...이 값을 사용하여 라즈베리 파이를 통해 색 농도를 제어하고 싶습니다. 다시 손을 문제에 어쨌든

, ...

I가 다음과 같은 파이썬 스크립트를

#!/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"상수는 float입니다. https://en.wikipedia.org/wiki/Floating_point – Welbog

+1

이러한 값은 "출구"가 아니며 거의 0.0입니다. 그들이 정확히 0이 아닌 이유는 [부동 소수점이 항상 정확한 것은 아닙니다] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken)입니다. –

+0

반올림 노이즈로 마지막 비트를 자르기 위해 'for range (50) : print (16 + sin (2 * pi * f * i/Fs)) -16'을 사용하십시오. – LutzL

답변

1

이 값은 "way-out-there"가 아니며 기계 정밀도에 대해 0과 일치합니다. 파이썬은 일반적으로 53 비트 정밀도를 가지고 이것에 대한

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

이진 표현은 당신이 당신의 사인 함수에 0으로 대응해야하는 값을보고 순서입니다 ~ 1E-16에 해당합니다.