The math.pow(x, y) function converts both of its arguments to floating-point numbers and returns x raised to the power of y (xy). Unlike Python's built-in pow(x, y) or the ** operator (which preserve arbitrary-precision integers), math.pow() always returns a float.
Strict Two-Argument Function: math.pow() strictly takes two arguments. If you need 3-argument modular exponentiation (baseexp % mod), use Python's core built-in pow(base, exp, mod).
The math.pow() function belongs to Python's standard math module and wraps the C standard library pow() function:
import math
result = math.pow(x, y)
| Parameter | Type | Description |
|---|---|---|
x (Base) |
float or int |
Required. The base number to be raised to the power y. |
y (Exponent) |
float or int |
Required. The power to which x is raised. |
| Return Value | float |
The computed value xy as an IEEE 754 64-bit float. |
ValueError |
Exception | Raised when x < 0 and y is not an integer (fractional powers of negative numbers). |
ZeroDivisionError |
Exception | Raised when x == 0.0 and y < 0 (e.g. math.pow(0, -2)). |
OverflowError |
Exception | Raised when the calculated value exceeds the maximum float (~1.79 × 10308). |
Examine how math.pow() converts arguments to floats across positive, negative, and fractional exponents:
import math
# Positive exponents: 2^3 == 8.0
print("pow(2, 3): ", math.pow(2, 3)) # Output: 8.0
# Negative exponents: 2^(-3) == 1 / 8 == 0.125
print("pow(2, -3): ", math.pow(2, -3)) # Output: 0.125
# Fractional exponents (nth roots): 27^(1/3) == 3.0
print("pow(27, 1/3): ", math.pow(27, 1/3)) # Output: 3.0
# Negative base with integer exponents
print("pow(-2, 3): ", math.pow(-2, 3)) # Output: -8.0
print("pow(-2, 4): ", math.pow(-2, 4)) # Output: 16.0
# Floats with decimals
print("pow(2.5, 2.0): ", math.pow(2.5, 2.0)) # Output: 6.25
Output:
pow(2, 3): 8.0
pow(2, -3): 0.125
pow(27, 1/3): 3.0
pow(-2, 3): -8.0
pow(-2, 4): 16.0
pow(2.5, 2.0): 6.25
Python provides three separate mechanisms for exponentiation. Choosing between them depends on the required precision and data types:
| Feature | math.pow(x, y) |
Built-in pow(x, y[, mod]) |
Operator x ** y |
|---|---|---|---|
| Return Type on Ints | Always float (8.0) |
Preserves int (8) |
Preserves int (8) |
| Arbitrary Precision | Limited to 53 bits float | Unlimited integer bits | Unlimited integer bits |
| Modular Exponentiation | No (strictly 2 args) | Yes (pow(b, e, m)) |
No |
Complex Roots (e.g. (-4)**0.5) |
Raises ValueError | Returns complex number | Returns complex number |
| Underlying Engine | C library pow() |
Python PyNumber_Power | Python bytecode BINARY_POWER |
import math
# 1. Integer precision demonstration
print("2 ** 100: ", 2 ** 100) # Exact 31-digit integer
print("math.pow(2,100):", math.pow(2, 100)) # 1.2676506002282294e+30 (float)
# 2. Complex number difference
print("(-4) ** 0.5: ", (-4) ** 0.5) # (1.22e-16 + 2j) complex
try:
math.pow(-4, 0.5)
except ValueError as e:
print("math.pow(-4, 0.5):", e) # math domain error
Output:
2 ** 100: 1267650600228229401496703205376
math.pow(2,100): 1.2676506002282294e+30
(-4) ** 0.5: (1.2246467991473532e-16+2j)
math.pow(-4, 0.5): math domain error
math.pow() enforces strict real-number domain limits:
Because taking a square root or fractional power of a negative number yields a complex number, real-valued math.pow() raises ValueError: math domain error:
import math
try:
math.pow(-2, 0.5)
except ValueError as err:
print("ValueError caught:", err)
Raising zero to a negative power represents division by zero (1 / 0n), which triggers a ZeroDivisionError:
try:
math.pow(0.0, -2)
except ZeroDivisionError as err:
print("ZeroDivisionError caught:", err)
When the resulting number exceeds approximately 1.79 × 10308, an OverflowError is raised:
try:
math.pow(10.0, 309)
except OverflowError as err:
print("OverflowError caught:", err)
The IEEE 754-2008 standard defines specific mathematical conventions for exponentiation edge cases. Notably, 1.0 raised to any power is always 1.0, even when the exponent is NaN or infinity:
import math
# 1.0 raised to NaN or Inf is strictly 1.0
print("pow(1.0, nan): ", math.pow(1.0, float('nan'))) # Output: 1.0
print("pow(1.0, inf): ", math.pow(1.0, float('inf'))) # Output: 1.0
# Any base raised to 0.0 is strictly 1.0
print("pow(nan, 0.0): ", math.pow(float('nan'), 0.0)) # Output: 1.0
print("pow(inf, 0.0): ", math.pow(float('inf'), 0.0)) # Output: 1.0
Output:
pow(1.0, nan): 1.0
pow(1.0, inf): 1.0
pow(nan, 0.0): 1.0
pow(inf, 0.0): 1.0
In financial calculations, monthly loan mortgage payments are calculated using the standard fixed-rate amortization equation:
Where P is the principal loan amount, r is the monthly interest rate (annual rate divided by 12), and n is the total number of monthly payments (years × 12). Let's build an amortization calculator using math.pow() verified with unit test assertions:
import math
def calculate_monthly_mortgage(principal, annual_interest_rate, years):
"""
Calculates fixed monthly mortgage payment and total interest paid:
M = P * (r * (1 + r)^n) / ((1 + r)^n - 1)
"""
if principal <= 0 or years <= 0:
raise ValueError("Principal and loan duration must be positive.")
if annual_interest_rate < 0:
raise ValueError("Interest rate cannot be negative.")
total_payments = years * 12
# Special case: 0% interest loan
if annual_interest_rate == 0.0:
monthly_payment = principal / total_payments
return (round(monthly_payment, 2), 0.0)
monthly_r = (annual_interest_rate / 100.0) / 12.0
growth_factor = math.pow(1.0 + monthly_r, total_payments)
monthly_payment = principal * (monthly_r * growth_factor) / (growth_factor - 1.0)
total_paid = monthly_payment * total_payments
total_interest = total_paid - principal
return (round(monthly_payment, 2), round(total_interest, 2))
# Unit Assertions
# Test Case 1: $200,000 loan at 6.5% for 30 years
m1, i1 = calculate_monthly_mortgage(200000.0, 6.5, 30)
assert m1 == 1264.14
assert i1 == 255088.98
# Test Case 2: $100,000 loan at 5.0% for 15 years
m2, i2 = calculate_monthly_mortgage(100000.0, 5.0, 15)
assert m2 == 790.79
assert i2 == 42342.85
# Test Case 3: 0% interest loan
m3, i3 = calculate_monthly_mortgage(12000.0, 0.0, 1)
assert m3 == 1000.0
assert i3 == 0.0
print(f"$200k mortgage (6.5%, 30yr): Monthly = ${m1} | Total Interest = ${i1}")
print("All loan amortization assertions passed successfully!")
Open in Google Colab View on GitHub
Run all math.pow() examples interactively, contrast precision with built-in pow() and **, inspect IEEE 754 edge cases, and simulate financial loan amortization schedules in Google Colab.
Author & Instructor at plus2net
I write and maintain practical tutorials on Python, PHP, SQL, JavaScript, HTML, jQuery, and web development at plus2net. The tutorials focus on clear explanations, working examples, and code that readers can test and adapt while learning.