The math.isfinite(x) function determines whether a numeric value x is finite. It returns True if x is neither an infinity (+inf, -inf) nor a Not-a-Number (nan), and returns False otherwise. It serves as Python's primary defensive filter to ensure numbers are safe for mathematical operations, database storage, and JSON serialization.
Unified IEEE 754 Check: math.isfinite(x) is logically equivalent to not (math.isinf(x) or math.isnan(x)), evaluating both checks simultaneously in a single, C-optimized operation.
The math.isfinite() function is part of Python's standard math module:
import math
math.isfinite(x)
| Component | Type | Description |
|---|---|---|
x |
float or int |
Required. The numeric value to test. |
| Return Value | bool |
True if x is finite (not inf, -inf, or nan); False otherwise. |
TypeError |
Exception | Raised if x is not a numeric data type (e.g. strings, lists, dictionaries, None). |
In Python, all standard integers, floating-point decimals, and zeros (including signed -0.0) are finite numbers:
import math
# Standard integers and floats
print("isfinite(42): ", math.isfinite(42)) # True
print("isfinite(-19.85): ", math.isfinite(-19.85)) # True
# Zeros (positive and negative zero are both finite)
print("isfinite(0.0): ", math.isfinite(0.0)) # True
print("isfinite(-0.0): ", math.isfinite(-0.0)) # True
# Arbitrarily large Python integers are always finite
print("isfinite(10**1000): ", math.isfinite(10**1000)) # True
# IEEE 754 Special Values (Infinities and NaNs)
print("isfinite(inf): ", math.isfinite(float('inf'))) # False
print("isfinite(-inf): ", math.isfinite(float('-inf'))) # False
print("isfinite(nan): ", math.isfinite(float('nan'))) # False
Output:
isfinite(42): True
isfinite(-19.85): True
isfinite(0.0): True
isfinite(-0.0): True
isfinite(10**1000): True
isfinite(inf): False
isfinite(-inf): False
isfinite(nan): False
Python provides three complementary functions in the math module to classify any numeric value according to the IEEE 754 standard. Exactly one of these categories is true for any valid floating-point number:
Value x |
math.isfinite(x) |
math.isinf(x) |
math.isnan(x) |
Category |
|---|---|---|---|---|
42.5 |
True | False | False | Normal Finite Float |
0.0 / -0.0 |
True | False | False | Zero (Finite) |
1e-315 |
True | False | False | Subnormal Float (Finite) |
float('inf') |
False | True | False | Positive Infinity |
float('-inf') |
False | True | False | Negative Infinity |
float('nan') |
False | False | True | Not-a-Number (NaN) |
Instead of writing separate checks for math.isnan(x) and math.isinf(x), a single call to math.isfinite(x) guards against both anomalies at once:
import math
def safe_reciprocal(x):
# Guard against zero, inf, and nan
if not math.isfinite(x) or x == 0.0:
return None
return 1.0 / x
print("Reciprocal(4.0): ", safe_reciprocal(4.0))
print("Reciprocal(inf): ", safe_reciprocal(float('inf')))
print("Reciprocal(nan): ", safe_reciprocal(float('nan')))
Output:
Reciprocal(4.0): 0.25
Reciprocal(inf): None
Reciprocal(nan): None
When ingesting raw datasets, mathematical anomalies (such as divide-by-zero results or log of negative numbers) create inf or nan entries. You can easily sanitize sequences using list comprehensions:
import math
raw_measurements = [12.4, float('nan'), 15.8, float('inf'), -9.2, float('-inf'), 0.0]
clean_data = [val for val in raw_measurements if math.isfinite(val)]
print("Raw data: ", raw_measurements)
print("Clean data:", clean_data)
Output:
Raw data: [12.4, nan, 15.8, inf, -9.2, -inf, 0.0]
Clean data: [12.4, 15.8, -9.2, 0.0]
The official JSON specification (RFC 8259) defines numbers strictly as finite decimal sequences. JSON does not support Infinity, -Infinity, or NaN.
By default, Python's json.dumps() produces non-standard JavaScript tokens when serializing NaNs or infinities. If your web API enforces strict JSON standards with allow_nan=False, encountering a non-finite float immediately raises a ValueError:
import json
import math
payload = {"status": "ok", "score": float('inf')}
try:
# Enforcing RFC 8259 strict compliance
json.dumps(payload, allow_nan=False)
except ValueError as err:
print("Strict JSON serialization failed:", err)
Output:
Strict JSON serialization failed: Out of range float values are not JSON compliant
Using math.isfinite() to sanitize dictionary values prior to serialization guarantees that your REST endpoints never crash when generating payloads.
In distributed IoT systems, faulty temperature and voltage sensors occasionally report corrupted values (hardware disconnected = inf, read timeout = nan, corrupted bus = string). Build a robust telemetry sanitizer that validates dictionaries of metrics, replacing non-finite or corrupted readings with a safe fallback value:
import math
def sanitize_telemetry(readings, fallback=None):
"""
Sanitizes a dictionary of sensor readings.
Any non-finite float (inf, -inf, nan) or non-numeric reading is replaced with fallback.
"""
if not isinstance(readings, dict):
raise TypeError("Readings must be provided as a dictionary.")
sanitized = {}
for sensor, value in readings.items():
if isinstance(value, (int, float)) and math.isfinite(value):
sanitized[sensor] = float(value)
else:
sanitized[sensor] = fallback
return sanitized
# Test Data
raw_telemetry = {
"temp_celsius": 24.5,
"humidity_pct": float('nan'),
"pressure_hpa": 1013.25,
"voltage_v": float('inf'),
"battery_pct": 85,
"status_code": "ERR_BUS" # Corrupted non-numeric
}
clean_telemetry = sanitize_telemetry(raw_telemetry, fallback=0.0)
# Unit Assertions
assert clean_telemetry["temp_celsius"] == 24.5
assert clean_telemetry["humidity_pct"] == 0.0 # NaN sanitized
assert clean_telemetry["pressure_hpa"] == 1013.25
assert clean_telemetry["voltage_v"] == 0.0 # Inf sanitized
assert clean_telemetry["battery_pct"] == 85.0
assert clean_telemetry["status_code"] == 0.0 # String sanitized
print("Sanitized Telemetry Output:")
print(clean_telemetry)
print("All telemetry sanitization assertions passed successfully!")
Open in Google Colab View on GitHub
Run all math.isfinite() examples interactively, test IEEE 754 edge cases, verify strict JSON serialization safety, and sanitize IoT telemetry streams 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.