2016-11-30 14 views
0

Как часть более крупного проекта, я хочу изменить некоторые значения в шаблоне длины волны, а не на диаграмме линейного типа +1.Неожиданные/нежелательные результаты в вычислении синусоидальной волны в 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

Используйте 'for i in range (50): print (16 + sin (2 * pi * f * i/Fs)) -16', чтобы обрезать последние биты шумом округления. – LutzL

ответ

1

Эти значения не являются «выходными», они согласуются с нулевой точностью машины. Python обычно имеет точность 53 бита:

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

Двоичное представление это соответствует ~ 1х-16, который является заказом вы видите в значениях, которые должны соответствовать с нулем в вашей функции синуса.