TheAlgorithms/Python · error · ValueError

area_triangle_three_sides() only accepts non-negative values

Error message

area_triangle_three_sides() only accepts non-negative values

What it means

area_triangle_three_sides() raises this ValueError when side1, side2, or side3 is negative. The function implements Heron's formula and first validates that all side lengths are non-negative. A negative side would make the expression under sqrt() meaningless, so the library rejects it before the separate triangle-inequality check.

Source

Thrown at maths/area.py:350

    >>> area_triangle_three_sides(1, -2, 1)
    Traceback (most recent call last):
        ...
    ValueError: area_triangle_three_sides() only accepts non-negative values
    >>> area_triangle_three_sides(2, 4, 7)
    Traceback (most recent call last):
        ...
    ValueError: Given three sides do not form a triangle
    >>> area_triangle_three_sides(2, 7, 4)
    Traceback (most recent call last):
        ...
    ValueError: Given three sides do not form a triangle
    >>> area_triangle_three_sides(7, 2, 4)
    Traceback (most recent call last):
        ...
    ValueError: Given three sides do not form a triangle
    """
    if side1 < 0 or side2 < 0 or side3 < 0:
        raise ValueError("area_triangle_three_sides() only accepts non-negative values")
    elif side1 + side2 < side3 or side1 + side3 < side2 or side2 + side3 < side1:
        raise ValueError("Given three sides do not form a triangle")
    semi_perimeter = (side1 + side2 + side3) / 2
    area = sqrt(
        semi_perimeter
        * (semi_perimeter - side1)
        * (semi_perimeter - side2)
        * (semi_perimeter - side3)
    )
    return area


def area_parallelogram(base: float, height: float) -> float:
    """
    Calculate the area of a parallelogram.

    >>> area_parallelogram(10, 20)
    200

View on GitHub (pinned to f5988cc097)

Solutions

  1. Validate all three sides >= 0 before the call; fix the negative value at its source.
  2. If sides are distances, ensure the distance routine returns abs() values.
  3. Filter/clean datasets to drop or repair negative side lengths.
  4. Catch ValueError and distinguish it from the triangle-inequality error for clearer diagnostics.

Example fix

// before
area = area_triangle_three_sides(a, b, c)  # a may be -1

# after
if a < 0 or b < 0 or c < 0:
    raise ValueError(f'sides must be non-negative: {a}, {b}, {c}')
area = area_triangle_three_sides(a, b, c)
Defensive patterns

Strategy: validation

Validate before calling

if side1 < 0 or side2 < 0 or side3 < 0:
    raise ValueError(f'sides must be non-negative: {side1}, {side2}, {side3}')
area = area_triangle_three_sides(side1, side2, side3)

Type guard

def has_non_negative_sides(sides: tuple) -> bool:
    return all(s >= 0 for s in sides)

Try / catch

try:
    area = area_triangle_three_sides(a, b, c)
except ValueError as e:
    raise ValueError(f'invalid triangle sides {(a, b, c)}: {e}') from e

Prevention

When it happens

Trigger: Calling area_triangle_three_sides(side1, side2, side3) with any argument < 0, e.g. area_triangle_three_sides(-1, 2, 4). The negativity check runs first, so a negative side raises this error even if the sides would otherwise violate the triangle inequality too.

Common situations: Side lengths from sensor measurements with sign glitches; distances computed via dot products that can be negative; test data generated over ranges that include negatives.

Related errors


AI-assisted analysis of TheAlgorithms/Python@f5988cc097 (2026-08-14). Data as JSON: /api/errors/599f21b7020cc4fa. Report an issue: GitHub.