Skip to content
This repository was archived by the owner on Sep 24, 2025. It is now read-only.

Commit b11e8f0

Browse files
committed
feat(calculator): add power operation with tests
1 parent 159bc22 commit b11e8f0

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

src/calculator.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,19 @@ def divide(a: Number, b: Number) -> Number:
4343
if b == 0:
4444
raise ZeroDivisionError("division by zero")
4545
return a / b
46+
47+
48+
def power(base: Number, exponent: Number) -> Number:
49+
"""
50+
Return ``base`` raised to the power of ``exponent``.
51+
52+
Supports integers and floats. For fractional exponents of negative bases,
53+
Python will return a complex number; since this module is typed for
54+
real numbers, such usage is not supported and will raise ``ValueError``.
55+
"""
56+
57+
# Disallow fractional exponent for negative base to keep return type real
58+
if isinstance(base, (int, float)) and isinstance(exponent, (int, float)):
59+
if base < 0 and not float(exponent).is_integer():
60+
raise ValueError("fractional power of a negative base is not a real number")
61+
return base**exponent

tests/test_calculator.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import pytest
66

7-
from src.calculator import add, divide, multiply, subtract
7+
from src.calculator import add, divide, multiply, power, subtract
88

99

1010
def test_add() -> None:
@@ -35,3 +35,23 @@ def test_divide_by_zero() -> None:
3535
"""divide raises ZeroDivisionError when dividing by zero."""
3636
with pytest.raises(ZeroDivisionError):
3737
divide(1, 0)
38+
39+
40+
def test_power_integers() -> None:
41+
"""power returns correct results for integer base and exponent."""
42+
assert power(2, 3) == 8
43+
assert power(5, 0) == 1
44+
assert power(-2, 4) == 16
45+
assert power(-2, 3) == -8
46+
47+
48+
def test_power_floats() -> None:
49+
"""power returns correct results for float exponents where applicable."""
50+
assert math.isclose(power(9, 0.5), 3.0)
51+
assert math.isclose(power(16.0, 0.25), 2.0)
52+
53+
54+
def test_power_invalid_fractional_negative_base() -> None:
55+
"""power raises ValueError for fractional exponent on negative base (non-real)."""
56+
with pytest.raises(ValueError):
57+
power(-8, 1 / 3)

0 commit comments

Comments
 (0)