TheAlgorithms/Python · error · ValueError
please ensure that density, diameter and viscosity are posit
Error message
please ensure that density, diameter and viscosity are positive
What it means
Raised by reynolds_number(density, velocity, diameter, viscosity) in physics/reynolds_number.py when density <= 0, diameter <= 0, or viscosity <= 0. Re = density*|velocity|*diameter/viscosity needs positive fluid properties and pipe diameter; velocity may be negative (abs() is applied) but the other three must be strictly positive.
Source
Thrown at physics/reynolds_number.py:54
"""
>>> reynolds_number(900, 2.5, 0.05, 0.4)
281.25
>>> reynolds_number(450, 3.86, 0.078, 0.23)
589.0695652173912
>>> reynolds_number(234, -4.5, 0.3, 0.44)
717.9545454545454
>>> reynolds_number(-90, 2, 0.045, 1)
Traceback (most recent call last):
...
ValueError: please ensure that density, diameter and viscosity are positive
>>> reynolds_number(0, 2, -0.4, -2)
Traceback (most recent call last):
...
ValueError: please ensure that density, diameter and viscosity are positive
"""
if density <= 0 or diameter <= 0 or viscosity <= 0:
raise ValueError(
"please ensure that density, diameter and viscosity are positive"
)
return (density * abs(velocity) * diameter) / viscosity
if __name__ == "__main__":
import doctest
doctest.testmod()
View on GitHub (pinned to f5988cc097)
Solutions
- Supply positive SI values: density in kg/m^3 (e.g. 1000 for water), diameter in m (e.g. 0.045), viscosity in Pa*s (e.g. 0.001)
- Guard fluid-property lookups so they never return 0/undefined outside the fitted range
- If velocity sign varies, keep it — the function applies abs() — but check the other three with a pre-call assertion
Example fix
# before reynolds_number(-90, 2, 0.045, 1) # ValueError: please ensure that density, diameter and viscosity are positive # after assert 0 < 0.045 and 0 < 1 and 0 < 1000 reynolds_number(1000, 2, 0.045, 1)
Defensive patterns
Strategy: validation
Validate before calling
if density <= 0 or diameter <= 0 or viscosity <= 0:
raise ValueError(f"need positive density/diameter/viscosity, got {density}/{diameter}/{viscosity}")
reynolds_number(density, velocity, diameter, viscosity) # velocity may be negative Try / catch
try:
re = reynolds_number(density, velocity, diameter, viscosity)
except ValueError as e:
if "positive" in str(e):
raise ValueError("check SI units: kg/m^3, m, Pa*s") from e
raise Prevention
- Velocity sign is fine (abs() applied); only density, diameter, viscosity must be > 0
- Guard fluid-property lookups against returning 0 outside valid ranges
When it happens
Trigger: reynolds_number(-90, 2, 0.045, 1) — negative density, as in the doctest; reynolds_number(0, 2, -0.4, -2) — zero density with negative diameter and viscosity; any call with diameter=0 (a collapsed/zero-size duct) or viscosity=0 (division by zero avoided).
Common situations: Unit mistakes such as diameter given as 0 (unitless) or in the wrong scale; viscosity entered as 0 for 'frictionless' idealization; property tables returning 0 outside their valid temperature range; sign conventions where density is stored signed after a pressure delta.
Related errors
- Gravitational force can not be negative
- Distance can not be negative
- Mass can not be negative
- Orbital radii must be greater than zero.
- The length should be non-negative
AI-assisted analysis of TheAlgorithms/Python@f5988cc097 (2026-08-14).
Data as JSON: /api/errors/8f169ad2d39ac10b.
Report an issue: GitHub.