2014-01-03 4 views
3

следующий код:numpy.sin (р) возвращает отрицательное значение

a = numpy.sin(2. * numpy.pi) 
print(a < 0) 

возвращение "Правда". Но на самом деле a = 0. Как я могу это исправить? Кроме того, у меня есть матрица с большим значением типа «а», и я хочу убедиться, что моя матрица содержит неотрицательное значение.

+1

Обратите внимание, что это не NumPy конкретнее, встроенный '' math.sin' и math.pi' также дают результат <0. – delnan

+0

Интересно, что в результате 'numpy.arccos (numpy.float128 (- 1)) 'является более точной аппроксимацией π, чем' numpy.pi'. Вы можете найти десятичное расширение здесь http://en.wikipedia.org/wiki/Pi#Approximate_value – primroot

ответ

2

В действительности <> 0, потому что в действительности numpy.pi не Pi (что Pi в действительности так или иначе?) - это только его приближение и numpy.sin не синус - это его приближение, а также. Таким образом, вы должны принять некоторые ошибки во внимание, например

print(-0.0000001 < a < 0.0000001) 

или использовать некоторые другие приемы (представляющие Pi иначе - не как числа с плавающей точкой).

+1

'' sine "! =" Sinus "'! – jonrsharpe

+0

@jonrsharpe Спасибо, очевидно, английский не мой родной язык. :) – freakish

+1

'sin' больше латинского через арабский через санскрит, чем английский * per se *, но я позволю ему сдвинуть это один раз! – jonrsharpe

0

Когда я вычисляю

numpy.sin(2 * numpy.pi) 

Я получаю

-2.4492935982947064e-16 # i.e. -0.0000000000000002 

Это классическая float ИНГ ошибка Точность точки. Вы лучше принимать подход допуска к тестированию значения:

if abs(a) < 0.0001: 
+0

Я не согласен с утверждением, что основной причиной является неточность с плавающей запятой (хотя она и влияет на нее). И синус, и Pi не являются математическим синусом и Pi. Это приближения. Например, в моем Python я вижу 'numpy.pi == 3.141592653589793'. Предполагая, что 'numpy.sin' является простой реализацией его серии Тейлора (ну, действительно имеет значение, насколько она реализована - очевидно, это приближение), тогда даже если вычисления в« реальной »арифметике вы все равно получите неверный результат , – freakish

+0

@freakish Это приближение pi является точным до 16 значимых позиций, что является точностью точности с плавающей точкой aka double, и я бы предположил, что хорошая реализация 'sin' будет иметь ошибку не большую, чем один эпсилон (то есть относительная точность поплавка). Это можно реализовать с помощью соответствующей серии Тейлора. – Nabla

+0

@freakish Приблизительная природа как 'sin', так и' pi' обусловлена ​​использованием арифметики с плавающей запятой. Символьная математическая система могла бы представлять «pi» как символ и использовать совпадение шаблонов для получения точного 'sin (pi)'. –

4

это из арифметики с плавающей точкой, а также причины точности. Результат - наилучшее приближение sin, которое можно представить как число с плавающей запятой. Обычно вы решаете почти ноль проблем, как это:

a = numpy.sin(2. * numpy.pi) 
print(abs(a) < 1e-10) 

Вы также можете прочитать this.

1
>>> import numpy 
>>> a = numpy.sin(2. * numpy.pi) 
>>> numpy.allclose(a, 0) 
True 
>>> numpy.clip(numpy.array([-0.1, 1.0, 2.0]), 0, np.inf) 
array([ 0., 1., 2.]) 
Смежные вопросы