Тригонометрическая функция Python возвращает неожиданные значения - PullRequest
4 голосов
/ 13 декабря 2011
import math
print "python calculator"
print "calc or eval"
while 0 == 0:
    check = raw_input() #(experimental evaluation or traditional calculator)
    if check == "eval":
        a = raw_input("operator\n") #operator
        if a == "+":
            b = input("arg1\n") #inarg1
            c = input("arg2\n") #inarg2
            z = b + c
            print z
        elif a == "-":
            b = input("arg1\n") #inarg1
            c = input("arg2") #inarg2
            z = b - c
            print z
        elif a == "/":
            b = input("arg1\n") #inarg1
            c = input("arg2\n") #inarg2
            z = b / c
            print z
        elif a == "*":
            b = input("arg1\n") #inarg1
            c = input("arg2]n") #inarg2
            z = b * c
            print z
        elif a == "^":
            b = input("arg1\n") #inarg1
            c = input("arg2\n") #inarg2
            z = b ** c
        elif a == "sin":
            b = input("arg1\n") #inarg1
            var = math.degrees(math.sin(b))
            print var
        elif a == "asin":
            b = input("arg1\n") #inarg1
            var = math.degrees(math.asin(b))
            print var
        elif a == "cos":
            b = input("arg1\n") #inarg1
            var = math.degrees(math.cos(b))
            print var
        elif a == "acos":
            b = input("arg1\n") #inarg1
            var = math.degrees(math.acos(b))
            print var
        elif a == "tan":
            b = input("arg1\n") #inarg1
            var = math.degrees(math.tan(b))
            print var
        elif a == "atan":
            b = input("arg1\n") #inarg1
            var = math.degrees(math.atan(b))
            print var
    elif check == "calc" :
        x = input() #takes input as expression
        print x #prints expression's result

Разве не синус 90 градусов 1? С этим это проявляется как что-то около 51,2? Калькулятор Google тоже это делает? Кстати: это мой питон калькулятор

            b = input("arg1\n") #inarg1
            var = math.degrees(math.sin(b))
            print var

Эта и другие триггерные функции являются проблемой. По большей части это был простой калькулятор на Python, но я хотел добавить некоторые триггерные функции.

Ответы [ 6 ]

10 голосов
/ 13 декабря 2011

Вы не хотите конвертировать возвращаемое значение sin() в градусы - возвращаемое значение не является углом. Вместо этого вы хотите преобразовать аргумент в радианы, поскольку math.sin() ожидает радианы:

>>> math.sin(math.radians(90))
1.0
3 голосов
/ 13 декабря 2011

Большинство математических функций, включая математические функции Python, используют радианы в качестве меры для тригонометрических подпрограмм .

Сравните:

>>> math.sin(90)
0.8939966636005579
>>> math.sin(3.1415926535)
8.979318433952318e-11
>>> math.cos(180)
-0.5984600690578581
>>> math.cos(2*3.1415926535)
1.0
>>> 
3 голосов
/ 13 декабря 2011

Грех питона и потому радианы не градусы. Вы можете конвертировать, используя функцию math.radians. В основном вы используете неправильные единицы измерения.

2 голосов
/ 13 декабря 2011
        var = math.degrees(math.sin(b))

Этот код не делает то, что вы думаете.Он принимает sin из b и затем преобразует этот ответ (который не в радианах!) Из радиан в градусы.

sin из 90 радиан составляет .894..894 радиан это 51 градус.Вот почему вы получаете этот ответ, но все неправильно.

Вы, вероятно, хотите:

        var = math.sin(math.radians(b))
2 голосов
/ 13 декабря 2011

Перед вызовом math.sin

преобразуйте вводимые данные из градусов в радианы.
2 голосов
/ 13 декабря 2011

Вы используете градусы, но функция sin ожидает радиан (см. Документацию: help(math.sin)). 90 ° - это ? / 2.

>>> import math
>>> math.sin(math.pi/2)
1.0
>>> math.radians(90) - math.pi/2
0.0
...