Вычисление тригонометрических функций в питоне

Как Python вычисляет тригонометрические функции? Я пытаюсь вычислить с помощью

x = ((0.1-0.001)/2)*math.sin(((1/20)*math.pi*20)+(0.5*math.pi*1))+((0.1-0.001)/2)+0.001

я собираюсь

x = 0.1

это почему? в обычном калькуляторе (в радианах) я получаю 0.001


person tafelrunde    schedule 18.03.2015    source источник
comment
Расчеты в радианах, чувак.   -  person ForceBru    schedule 18.03.2015
comment
Вы используете это на python 2? В python 3 я получаю правильный результат, проблема в том, как выполняется округление, попробуйте добавить это перед вашим расчетом from __future__ import division   -  person EdChum    schedule 18.03.2015
comment
Вы пытались оценить подвыражения?   -  person Karoly Horvath    schedule 18.03.2015


Ответы (3)


В Python 2 / — целочисленное деление, вам нужно импортировать __future__ .division для плавающего деления:

>>> from __future__ import division
>>> import math
>>> x = ((0.1-0.001)/2)*math.sin(((1/20)*math.pi*20)+(0.5*math.pi*1))+((0.1-0.001)/2)+0.001
>>> x
0.001
person kasravnd    schedule 18.03.2015
comment
Вам нужно импортировать __future__ .division. Почему? - person Kevin; 18.03.2015
comment
Python 2 по умолчанию приводит к целым числам при делении целых чисел. В Python 3 этого нет, поэтому мы можем импортировать эту функциональность с плавающей запятой. - person Malik Brahimi; 18.03.2015
comment
@MalikBrahimi да! это одна из самых основных вещей в питоне! я добавляю ссылку на относительный вопрос в SO для OP! что я думаю, что для ОП лучше, чтобы он мог прочитать все описания там! тем не менее я получаю 2 голоса против !!!!!!!!!!! - person kasravnd; 18.03.2015

В python2.x, python берет на себя целочисленное деление. Таким образом, вам нужно импортировать division из библиотеки __future__ в верхней части вашей программы.

from __future__ import division
x = ((0.1-0.001)/2)*math.sin(((1/20)*math.pi*20)+(0.5*math.pi*1))+((0.1-0.001)/2)+0.001
print x
person A.J. Uppal    schedule 18.03.2015
comment
Альтернативный способ — указать число с плавающей запятой, если вам нужен результат с плавающей запятой. Таким образом, 1/20 становится 1.0/20.0 (или 1./20., или 1./20). (Я проголосовал за ответ.) Возможно, вы захотите изменить деление раундов Python на целочисленное деление раундов Python. Собственно патроны тоже не совсем то. Он берет слово. - person Steven Rumbalski; 18.03.2015
comment
@StevenRumbalski, что говорит мой ответ - person Vidhya G; 18.03.2015
comment
на самом деле только один операнд должен быть с плавающей запятой - person joel goldstick; 19.03.2015

Просто сделайте ваши целые числа, такие как 2 с плавающей запятой 2.0, иначе Python 2.x использует целочисленное деление, также известное как полное деление (округление до минус бесконечности, например, -9/8 дает -2, 9/8 дает 1), при делении целых чисел на другие целые числа (простые или длинные):

x = ((0.1-0.001)/2.0)*math.sin(((1/20.0)*math.pi*20)+(0.5*math.pi*1))+((0.1-0.001)/2.0)+0.001

и:

print x
0.001
person Vidhya G    schedule 18.03.2015