Обработка ошибок np.arccos () и классификация треугольников в Python

Код ниже является моей попыткой вызова codewars с просьбой вычислить внутренние углы треугольника . Действительно неэлегантная, грубая сила. Я прохожу все тестовые случаи, но также получаю ошибку:

-c:37: RuntimeWarning: invalid value encountered in arccos
-c:38: RuntimeWarning: invalid value encountered in arccos
-c:39: RuntimeWarning: invalid value encountered in arccos

Таким образом, я пытаюсь выяснить, как мои текущие проверки не ловят недопустимые значения до вычисления гамма (отмечено с ** в коде, ниже).

ПРОБЛЕМА:

Вы должны рассчитать тип треугольника с тремя заданными сторонами a, b и c (заданными в любом порядке).

Если все углы меньше 90°, Этот треугольник острый, и функция должна возвращать 1.

Если один угол строго 90°, Этот треугольник является правильным, и функция должна возвращать 2.

Если один угол больше 90°, Этот треугольник тупой и функция должна возвратить 3.

Если три стороны не могут сформировать треугольник, или один угол равен 180° (что превращает треугольник в сегмент) — функция должна возвращать 0.

Входные параметры-стороны заданного треугольника. Все входные значения являются неотрицательными с плавающей точкой или целыми числами (или обоими).

import numpy 
def triangle_type(a, b, c):
    # Should return triangle type:
    #  0 : if triangle cannot be made with given sides
    #  1 : acute triangle
    #  2 : right triangle
    #  3 : obtuse triangle

    # make sure all sides are non-zero
    if a and b and c:
        pass
    else:
        return 0

    # triangle inequality test
    if not ((c - b) < a < (c + b)) and ((a - c) < b < (a + c)) and ((b - a) < b < (b + a)):
        return 0
    elif a < b < c or b < a < c:
        # print a,b,c
        pass
    elif b < c < a or c < b < a:
        a, c = c, a
        # print a, b, c
    elif c < a < b or a < c < b:
        b, c = c, b
        # print a, b, c
    else:
        # print a, b, c
        pass

    # calculate the gammas **THIS IS WHERE I NEED HELD**
    gamma_1 = numpy.rad2deg(numpy.arccos((a * a + b * b - c * c) / (2.0 * a * b)))
    gamma_2 = numpy.rad2deg(numpy.arccos((c * c + a * a - b * b) / (2.0 * c * a)))
    gamma_3 = numpy.rad2deg(numpy.arccos((b * b + c * c - a * a) / (2.0 * b * c)))

    #check for a right angle
    if (a * a + b * b == c * c) or (b * b + c * c == a * a) or (c * c + b * b == a * a):
        return 2
    #check acute angles
    elif max(gamma_1, gamma_2, gamma_3) < 90.0:
        return 1
    #check obtuse 
    elif max(gamma_1, gamma_2, gamma_3) > 90.0:
        return 3
    else:
        return 0

Я не могу проверить валидность gammaзначений без фактического вызова, таким образом генерируя ошибку. Как обойти эту проблему?

Некоторые тестовые случаи

triangle_type(7,3,2) # Not triangle 0
triangle_type(2,4,6) # Not triangle 0
triangle_type(8,5,7) # Acute 1
triangle_type(3,4,5) # Right 2
triangle_type(7,12,8) # Obtuse 3

Но это ни в коем случае не является исчерпывающим — есть 121 других тестов, которые я не вижу.

1 ответ

  1. Вы должны проверить значения, которые вы передаете numpy.arccos. Они должны быть между -1 и 1. Но из-за вычислений с плавающей точкой они могут оказаться больше 1 или меньше -1.