Приближенные результаты вместо точного

Запускаю следующий код

print(math.sin(math.radians(30)))
print(Decimal(math.sin(math.radians(30))))
print(1/2)

и получаю

0.49999999999999994
0.499999999999999944488848768742172978818416595458984375
0.5

Как добиться sin30 = 0.5? Спасибо


Ответы (1 шт):

Автор решения: BlueScreen

Компьютер вычисляет сумму тригонометрических выражений при помощи рядов Тейлора:

введите сюда описание изображения

Источник

Т.е. любую тригонометричискую функцию можно представить в виде суммы выражений, которые возможно рассчитать стандартными методами. Но так как считать бесконечную сумму долго (бесконечно долго) то для примерной оценки достаточно взять большОе количество слагаемых. Это очень похоже на эту проблему тык, но тот метод решение здесь не поможет, ведь дело не только в float - представлении чисел в Python, но и в методе расчёта. Решение зависит от вашей задачи. Если вам важно очень примерное значение, то способ описанный в пост скриптум подходит, если нет, то лучше написать функцию в которую забить целые значения синусов итп:

def sin(alpha):
   #alpha - float. Angle in degrees.

   if (alpha % 360 == 30) or (alpha % 360 == 150):
      return 0.5

   elif (alpha % 360 == 330) or (alpha % 360 == 150):   #Учитывая переодичность sin
      return -0.5

   else:
       return math.sin(math.radians(30)

P.S. print(f'{math.sin(math.radians(30)):.1f}') отличное решение для 30 градусов, но не подходит для других, нецелых чисел. Например:

>>> print(f'{math.sin(math.radians(60)):.1f}')
0.9
→ Ссылка