Вычисление точного обратного синуса угла в 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 шт):
Выражение '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
В качестве альтернативной идеи (вывод: 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")