Погрешность вычислений градусов в 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)

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