Погрешность вычислений градусов в Python
Создаю графический калькулятор на PyQt5. Есть класс Figure_2D, который отвечает за решение арифметических функций. Функция зависит от входных данных и что нужно найти. К примеру: для поиска сторон доступно 5 функций.
Выглядит интерфейс вот так:

Проблема заключается в точности вычислений там, где в функции используются градусы. Я хочу чтобы точность вывода была 1-2 знака после запятой для сторон, диагоналей, радиуса и целое число для углов. Если мы ищем угол между стороной и диагональю с помощью функций sin α = a/d или cos α = b/d возникает погрешность в 3 градуса для параметров: a = 3, b = 5, d = 5.83. Мой код выдает результат в 31 градус. Но, когда я пытаюсь найти угол β по формуле sinβ=2S/d**2, я получаю результат 57 градусов. Соответственно сумма углов равна 93 градуса, что ложь. Я использовала для вычислений округление round() и функцию Decimal(), но результат не поменялся. Подскажите, пожалуйста, как мне добиться правильного, желаемого результата вычислений? Минимальный код для воспроизведения:
import math
from decimal import Decimal
import decimal
diag = float(input()) # 5.83
sideA = float(input()) # 3
angleA = Decimal(math.degrees((math.asin(sideA / diag)))).quantize(Decimal('1'), decimal.ROUND_HALF_UP)
square = round(sideA * math.sqrt(diag ** 2 - sideA ** 2))
angleB = Decimal(math.degrees(math.asin((2 * square / (diag ** 2))))).quantize(Decimal('1'), decimal.ROUND_HALF_UP)
print(
f"diag: {diag}\nsideA: {sideA}\nangleA: {angleA}\nangleB: {angleB}\nsquare: {square}\n"
)
Вывод:
diag: 5.83
sideA: 3.0
angleA: 31
angleB: 62
square: 15
Кусок кода:
def result(self):
"""Метод рассчитывает результат в зависимости от входных данных (что ищем, введенных параметров, и функции).
Проверяет углы на величину 180 градусов.
"""
if self.whatsearch == 1: # Стороны
if self.variant == 0:
self.diagonal = self.data_input.get("lineEdit_page1_line3_input")
self.side_desired = math.sqrt(self.diagonal ** 2 - self.side ** 2)
elif self.variant == 1:
self.square = self.data_input.get("lineEdit_page1_line4_input")
self.side_desired = self.square / self.side
elif self.variant == 2:
self.perimeter = self.data_input.get("lineEdit_page1_line5_input")
self.side_desired = (self.perimeter - 2 * self.side) / 2
elif self.variant == 3:
if self.data_input.get("lineEdit_page1_line3_input"):
self.diameter = self.data_input.get("lineEdit_page1_line3_input")
else:
self.diameter = self.data_input.get("lineEdit_page1_line2_input")
if self.data_input.get("lineEdit_page1_line6_input") < 180:
self.angleA = self.data_input.get("lineEdit_page1_line6_input")
self.sideA = self.diameter * round(math.sin(math.radians(self.angleA)), 2)
self.sideB = self.diameter * round(math.cos(math.radians(self.angleA)), 2)
return Decimal(f"{self.sideA}").quantize(Decimal('1.0'), decimal.ROUND_HALF_UP), \
Decimal(f"{self.sideB}").quantize(Decimal('1.0'), decimal.ROUND_HALF_UP)
else:
self.error_show()
return False
elif self.variant == 4:
if self.data_input.get("lineEdit_page1_line3_input"):
self.diameter = self.data_input.get("lineEdit_page1_line3_input")
else:
self.diameter = self.data_input.get("lineEdit_page1_line2_input")
if self.data_input.get("lineEdit_page1_line7_input") < 180:
self.angleB = self.data_input.get("lineEdit_page1_line7_input")
self.sideA = self.diameter * math.sin(math.radians(self.angleB / 2))
self.sideB = self.diameter * math.cos(math.radians(self.angleB / 2))
return Decimal(f"{self.sideA}").quantize(Decimal('1.0'), decimal.ROUND_HALF_UP), \
Decimal(f"{self.sideB}").quantize(Decimal('1.0'), decimal.ROUND_HALF_UP)
else:
self.error_show()
return False
return Decimal(f"{self.side_desired}").quantize(Decimal('1.0'), decimal.ROUND_HALF_UP)
elif self.whatsearch == 6: # Угол между стороной и диагональю прямоугольника
if self.variant == 0:
self.diagonal = self.data_input.get("lineEdit_page1_line3_input")
if self.sideA:
self.angleA = math.degrees((math.asin(self.sideA / self.diagonal)))
elif self.sideB:
self.angleA = math.degrees((math.acos(self.sideB / self.diagonal)))
elif self.variant == 1:
if self.data_input.get("lineEdit_page1_line4_input") < 180:
self.angleB = self.data_input.get("lineEdit_page1_line4_input")
self.angleA = (self.angleB / 2)
else:
self.error_show()
return False
return Decimal(f"{self.angleA}").quantize(Decimal('1'), decimal.ROUND_HALF_UP)
elif self.whatsearch == 7: # угол между диагоналями прямоугольника
if self.variant == 0:
if self.data_input.get("lineEdit_page1_line3_input") < 180:
self.angleA = self.data_input.get("lineEdit_page1_line3_input")
self.angleB = (2 * self.angleA)
else:
self.error_show()
return False
elif self.variant == 1:
self.square = self.data_input.get("lineEdit_page1_line1_input")
self.diagonal = self.data_input.get("lineEdit_page1_line2_input")
self.angleB = math.degrees(math.asin((2 * self.square / (self.diagonal ** 2))))
return Decimal(f"{self.angleB}").quantize(Decimal('1'), decimal.ROUND_HALF_UP)
