Вычисление точного обратного синуса угла в sympy

Есть строка, например '7+asin(0.8-0.3)'. Если поместить её внутрь print(simplify(parse_expr()).evalf(32)), sympy выводит значение обратного синуса в радианах, но даже если дополнять строку методом deg: '7+deg(asin(0.8-0.3))', то при выводе получается 37.000000000000001092276223729355, тогда как ожидалось просто 37. Как решить эту проблему без округления?


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

Автор решения: Stanislav Volodarskiy

Выражение '7 + asin(0.8 - 0.3)' содержит вещественные десятичные дроби. sympy в этом случае считает выражение приближённо. Если попросить sympy.simplify представлять десятичные дроби рациональными числами (флаг rational=True), результаты станут точными:

@>>> simplify('7 + asin(0.8 - 0.3)', rational=True)
pi/6 + 7
@>>> simplify('7 + deg(asin(0.8 - 0.3))', rational=True)
37

Или можно заменить десятичные дроби на обыкновенные:

@>>> simplify('7 + asin(8/10 - 3/10)')
pi/6 + 7
@>>> simplify('7 + deg(asin(8/10 - 3/10))')
37
→ Ссылка
Автор решения: Fox Fox

В качестве альтернативной идеи (вывод: 37.0):

import os
import math

result = eval('7 + (math.asin(0.8 - 0.3) * (180 / math.pi))')

print(f"Результат: {result}")

print("\nНажмите любую клавишу для продолжения...")
os.system("pause > nul" if os.name == "nt" else "read > /dev/null")
→ Ссылка