Как я могу эффективно преобразовать угол в градусах в радианы в Python?

Я пишу код на Python 3, чтобы выполнить некоторые вычисления с некоторыми параметрами, которые пользователь вводит с клавиатуры.

При тестировании программы я столкнулся и выделил следующую проблему:

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

Вот часть кода:

import math

degrees = int(input())

radians = degrees*(math.pi/180)

print(math.sin(radians))

Таким образом, большинство значений, которые вы вводите в градусах, выглядят нормально, но когда вы вводите 180º (соответствует PI, а результат должен быть 0), выходное значение представляет собой очень маленькое значение (1,2246467991473532e-16), но не 0.


person Jdavid_Ar08    schedule 22.04.2021    source источник
comment
Я думаю, вы просто установили пороговое значение. Если результат становится ниже этого значения, вы печатаете 0.   -  person AlpacaMax    schedule 23.04.2021


Ответы (3)


Значение math.pi является константой, равной 3.141592653589793. Очевидно, что это не то же самое, что значение pi, потому что десятичные дроби бесконечны.

Чтобы исправить это, вы можете round(value, 2) получить 2 десятичных знака.

person Frédéric Perron    schedule 22.04.2021
comment
вы можете просто использовать второй необязательный аргумент для округления до определенного числа знаков после запятой. round(value,2) округляет до двух знаков после запятой. - person David Oldford; 23.04.2021
comment
По какой-то причине я думал, что использую Java... Спасибо, что указали на это. - person Frédéric Perron; 23.04.2021

Это нормально, потому что вы имеете дело с числами с плавающей запятой, и природа Пи, конечно, не помогает. Действительно ли это вызывает проблему? то есть вызывает ли эта крошечная неточность проблемы в коде, использующем эту функцию? Если вы вводите только целые значения градусов, я сомневаюсь, что это действительно так. Вы, вероятно, можете игнорировать это. Вы можете округлить свои результаты, используя round (round(number,5) округлит до 5 знаков после запятой). затем просто поиграйте со знаками, чтобы вывести нужное значение. Вы заметите, что 0 и 90 возвращают 0 и 1 соответственно из math.sin.

Специальные значения:

lookup = {180:0}
if degrees in lookup.keys(): return lookup[degrees]
else: do normal thing

если 180 - единственная проблема, вы можете просто использовать оператор if. использование симметрии греха немного сложнее, и, вероятно, раунд удовлетворит ваши потребности. используя ваш код 180 и 360 - единственные углы, которые не возвращают точное значение для точек, которые должны возвращать 0 и 1. вы можете избавиться от проблемы 360, выполнив модуль 360 градусов = градусов% 360, который будет правильно зажимать ваши углы между 0 и 359.

person David Oldford    schedule 22.04.2021

Как насчет приведения к round()?

import math
degrees = int(input("Enter the angle in degrees: "))
radians = degrees*(math.pi/180)
print(round(math.sin(radians)))

Что выводит 0 при вводе 180. Но вы правы, что он будет округлен до ближайшего целого числа, несмотря ни на что.

math имеет math.radians(), который легко преобразуется в радианы, но не исправит ваш ложный 0. Я согласен с другим комментатором в том, что вам может потребоваться установить порог, и все, что ниже этого, печатает 0.

import math
degrees = int(input("Enter the angle in degrees: "))
sin = math.sin(math.radians(degrees))
if -0.01 < sin < 0.01:
    print(0)
else:
    print("{:0.2f}".format(sin))
person chemicalwill    schedule 22.04.2021