pin_drop当前位置:知识文库 ❯ 图文
Python math常量详解 - math.pi、math.e、math.inf、math.nan使用指南
概述
math 模块定义了多个重要的数学常量,这些常量以高精度浮点数的形式提供,是科学计算和工程计算的基础。主要包括:圆周率 pi(约 3.14159)、自然常数 e(约 2.71828)、2 倍圆周率 tau(约 6.28318)、正无穷 inf 和非数字 nan。
这些常量在数学公式、物理方程、概率统计等场景中广泛使用。pi 和 e 是数学中最重要的两个常数,分别出现在几何学和微积分的众多公式中;tau 是 pi 的两倍,在某些公式中可以简化表达;inf 和 nan 则是浮点数运算中的特殊值,用于表示无穷大和无效结果。
语法与常量列表
代码示例
import math
math.pi # 圆周率 π
math.e # 自然常数 e
math.tau # 2倍圆周率 τ = 2π
math.inf # 正无穷
math.nan # 非数字(Not a Number)参数说明
所有常量均为 float 类型,具有约 15-17 位有效数字的精度(IEEE 754 双精度浮点数)。
代码示例
示例1:圆周率与自然常数
代码示例
import math
# 圆周率
print(f"pi = {math.pi}")
print(f"tau = {math.tau}")
print(f"2 * pi == tau: {2 * math.pi == math.tau}")
# 自然常数
print(f"\ne = {math.e}")
print(f"ln(e) = {math.log(math.e)}")
print(f"e^1 = {math.exp(1)}")
# 圆的面积与周长
radius = 5
area = math.pi * radius ** 2
circumference = 2 * math.pi * radius
print(f"\n半径{radius}的圆:")
print(f" 面积 = pi * r^2 = {area:.4f}")
print(f" 周长 = 2 * pi * r = {circumference:.4f}")
# 使用 tau 简化公式
circumference_tau = math.tau * radius
print(f" 周长 = tau * r = {circumference_tau:.4f}")
# 输出:
# pi = 3.141592653589793
# tau = 6.283185307179586
# 2 * pi == tau: True
#
# e = 2.718281828459045
# ln(e) = 1.0
# e^1 = 2.718281828459045
#
# 半径5的圆:
# 面积 = pi * r^2 = 78.5398
# 周长 = 2 * pi * r = 31.4159
# 周长 = tau * r = 31.4159示例2:无穷大与非数字
代码示例
import math
# 正无穷
print(f"inf = {math.inf}")
print(f"inf + 1 = {math.inf + 1}")
print(f"inf * 2 = {math.inf * 2}")
print(f"inf > 1e308 = {math.inf > 1e308}")
print(f"-inf = {-math.inf}")
# 无穷大的运算
print(f"\n1 / inf = {1 / math.inf}") # 0.0
print(f"inf - inf = {math.inf - math.inf}") # nan
print(f"inf / inf = {math.inf / math.inf}") # nan
# NaN 的特殊性质
print(f"\nnan = {math.nan}")
print(f"nan == nan: {math.nan == math.nan}") # False! NaN不等于自身
print(f"nan != nan: {math.nan != math.nan}") # True
print(f"nan > 0: {math.nan > 0}") # False
print(f"nan < 0: {math.nan < 0}") # False
print(f"math.isnan(nan): {math.isnan(math.nan)}") # 正确的判断方式
print(f"math.isinf(inf): {math.isinf(math.inf)}") # 判断无穷大
print(f"math.isfinite(1.0): {math.isfinite(1.0)}") # 判断有限数
# 输出:
# inf = inf
# inf + 1 = inf
# inf * 2 = inf
# inf > 1e308 = True
# -inf = -inf
#
# 1 / inf = 0.0
# inf - inf = nan
# inf / inf = nan
#
# nan = nan
# nan == nan: False
# nan != nan: True
# nan > 0: False
# nan < 0: False
# math.isnan(nan): True
# math.isinf(inf): True
# math.isfinite(1.0): True示例3:常量在实际公式中的应用
代码示例
import math
# 使用 pi 计算球体体积
def sphere_volume(radius):
return (4/3) * math.pi * radius ** 3
# 使用 e 计算连续复利
def continuous_compound(principal, rate, time):
"""A = P * e^(rt)"""
return principal * math.exp(rate * time)
# 使用 tau 简化角度计算
def rad_to_deg(rad):
"""弧度转角度:1弧度 = 360/tau 度"""
return rad * 360 / math.tau
def deg_to_rad(deg):
"""角度转弧度:1度 = tau/360 弧度"""
return deg * math.tau / 360
# 使用 inf 作为初始值
def find_min(numbers):
"""找最小值,用 inf 作为初始值"""
min_val = math.inf
for n in numbers:
if n < min_val:
min_val = n
return min_val
# 使用 nan 标记无效数据
def safe_divide(a, b):
"""安全除法,除零返回 nan"""
if b == 0:
return math.nan
return a / b
# 测试
print(f"地球体积: {sphere_volume(6371):.3e} km³")
print(f"1万元5%利率10年: {continuous_compound(10000, 0.05, 10):.2f}元")
print(f"pi弧度 = {rad_to_deg(math.pi):.1f}度")
print(f"180度 = {deg_to_rad(180):.4f}弧度")
print(f"最小值: {find_min([3, 1, 4, 1, 5, 9, 2, 6])}")
print(f"1/0 = {safe_divide(1, 0)}")
print(f"是否无效: {math.isnan(safe_divide(1, 0))}")
# 输出:
# 地球体积: 1.083e+12 km³
# 1万元5%利率10年: 16487.21元
# pi弧度 = 180.0度
# 180度 = 3.1416弧度
# 最小值: 1
# 1/0 = nan
# 是否无效: True实际应用场景
-
几何计算:使用
pi计算圆、球、圆柱等几何体的面积和体积 -
金融计算:使用
e计算连续复利、指数增长模型 -
角度计算:使用
tau简化弧度与角度的转换公式 -
边界处理:使用
inf作为求最小值的初始值、表示无上界 -
数据清洗:使用
nan标记缺失值或无效计算结果 -
算法设计:使用
inf表示图算法中不可达的距离
注意事项
注意1:
math.nan不等于任何值,包括自身。判断 NaN 必须使用math.isnan()函数,不能用==比较。
注意2:
math.inf是正无穷,负无穷用-math.inf表示。任何正数除以 0 得到inf,任何负数除以 0 得到-inf。
注意3:
math.tau在 Python 3.6 中引入。使用tau可以简化很多公式,如圆的周长 =tau * r,1弧度 =360/tau度。
注意4:
inf - inf和inf / inf的结果都是nan,因为这类运算在数学上是不定式。
注意5:
float('inf')和float('nan')也可以创建无穷大和 NaN,但math.inf和math.nan更规范、更清晰。
提示:在数据处理中,
nan会"污染"计算结果——任何与nan的算术运算结果都是nan。使用math.isnan()检查并过滤nan值。
相关方法对比
小贴士
math.tau 的引入源于一场数学运动——Tau Manifesto(τ宣言)。支持者认为 τ(圆的周长与半径之比)比 π 更自然地表达圆的几何性质。虽然 π 已经根深蒂固,但在某些场景下使用 τ 可以让公式更加简洁优雅。
小结
-
math.pi是圆周率,math.e是自然常数,math.tau是 2*pi -
math.inf表示正无穷,math.nan表示非数字 -
nan不等于自身,需用math.isnan()判断 -
inf用作初始值和边界,nan用于标记无效数据 -
这些常量是科学计算的基础,在各类数学公式中广泛使用
练习题
练习1
使用 math.pi 计算半径为 3 的球的表面积(4πr²)和体积(4/3 πr³)。
练习2
编写一个函数 is_valid_number(x),判断 x 是否为有限数(不是 inf 也不是 nan),使用 math.isfinite() 实现。
练习3
使用 math.e 和 math.exp() 验证 e^1 = e,e^0 = 1,e^(-1) = 1/e。
练习4
编写一个函数 clean_data(data),将列表中的 nan 值过滤掉,返回只包含有效数字的新列表。
常见问题
math.pi 的精度有多高?能满足科学计算需求吗?
math.pi 使用 IEEE 754 双精度浮点数,约有 15-17 位有效数字(3.141592653589793)。对于大多数科学计算和工程应用已足够精确。如果需要更高精度,可以使用第三方库如 decimal(可设置任意精度)或 mpmath(支持任意精度数学运算)。
为什么 nan == nan 返回 False?
这是 IEEE 754 浮点数标准的规定。NaN 代表"不是一个数字",它不是具体的值而是一个状态标记。两个无效的结果无法互相比较,因此 NaN 不等于任何值,包括它自己。正确判断 NaN 的方式是使用 math.isnan() 函数。
math.inf 可以直接参与数学运算吗?
可以。math.inf 可以参与加减乘除等运算:inf + 1 = inf,inf * 2 = inf,1 / inf = 0.0。但需要注意 inf - inf 和 inf / inf 会产生 nan(不定式),inf * 0 也会产生 nan。这些运算遵循 IEEE 754 浮点数标准。
math.tau 和 math.pi 该优先使用哪个?
两者完全等价(tau = 2 * pi)。如果你的公式中经常出现 2π(如角度转换、圆周长),使用 tau 可以让代码更简洁。但如果你的团队或领域更习惯使用 pi,继续使用 pi 即可。选择哪个主要取决于个人偏好和代码可读性。
在数据处理中如何正确处理 nan 值?
nan 会"污染"算术运算(任何数 + nan = nan)。处理方法:1)使用 math.isnan() 检测并过滤;2)在 pandas 中使用 dropna() 或 fillna() 处理缺失值;3)在 numpy 中使用 nanmean()、nansum() 等忽略 nan 的函数。在数据清洗阶段务必先处理 nan,否则会影响后续分析结果。
本文涉及AI创作
内容由AI创作,请仔细甄别