Изчисляване на тригонометрични функции в python

Как 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 да! това е едно от най-основните неща в Python! добавям връзката на относителен въпрос в SO за OP! че мисля, че е по-добре за 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
Алтернативен начин е да посочите float, когато искате резултат с float. Така 1/20 става 1.0/20.0 (или 1./20. или 1./20). (Гласувах за отговора.) Може да искате да промените разделянето на python кръгове на деление на integer на python кръгове. Всъщност кръгове също не е съвсем правилно. Взема думата. - person Steven Rumbalski; 18.03.2015
comment
@StevenRumbalski, което казва моят отговор - person Vidhya G; 18.03.2015
comment
всъщност само един операнд трябва да бъде float - person joel goldstick; 19.03.2015

Просто направете целите си числа като 2 float 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