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

这些常量在数学公式、物理方程、概率统计等场景中广泛使用。pie 是数学中最重要的两个常数,分别出现在几何学和微积分的众多公式中;taupi 的两倍,在某些公式中可以简化表达;infnan 则是浮点数运算中的特殊值,用于表示无穷大和无效结果。


语法与常量列表

代码示例

import math

math.pi    # 圆周率 π
math.e     # 自然常数 e
math.tau   # 2倍圆周率 τ = 2π
math.inf   # 正无穷
math.nan   # 非数字(Not a Number)

参数说明

常量 精确值(前15位) 类型 说明
math.pi 3.141592653589793 float 圆周率,圆的周长与直径之比
math.e 2.718281828459045 float 自然常数,自然对数的底数
math.tau 6.283185307179586 float 2倍圆周率,圆的周长与半径之比
math.inf inf float 正无穷,大于任何有限浮点数
math.nan nan float 不是一个合法数字的值

所有常量均为 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 表示图算法中不可达的距离


注意事项

注意1math.nan 不等于任何值,包括自身。判断 NaN 必须使用 math.isnan() 函数,不能用 == 比较。

注意2math.inf 是正无穷,负无穷用 -math.inf 表示。任何正数除以 0 得到 inf,任何负数除以 0 得到 -inf

注意3math.tau 在 Python 3.6 中引入。使用 tau 可以简化很多公式,如圆的周长 = tau * r,1弧度 = 360/tau 度。

注意4inf - infinf / inf 的结果都是 nan,因为这类运算在数学上是不定式。

注意5float('inf')float('nan') 也可以创建无穷大和 NaN,但 math.infmath.nan 更规范、更清晰。

提示:在数据处理中,nan 会"污染"计算结果——任何与 nan 的算术运算结果都是 nan。使用 math.isnan() 检查并过滤 nan 值。

相关方法对比

特性 math.pi math.e math.tau math.inf math.nan
类型 float float float float float
精度 15位有效 15位有效 15位有效 IEEE 754 IEEE 754
Python版本 所有 所有 3.6+ 3.5+ 3.5+
等价写法 - - 2 * math.pi float('inf') float('nan')
典型用途 几何计算 对数/复利 简化公式 边界值/初始值 无效标记
判断函数 - - - math.isinf() math.isnan()

小贴士

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.emath.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,否则会影响后续分析结果。

标签: Python math常量 math.pi math.e math.inf math.nan

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python math三角函数详解 - sin/cos/tan与反三角函数使用指南 下一篇: Python random模块入门 - 伪随机数生成器全面使用指南

poll相关推荐