math模块仅支持标量运算,处理numpy数组需改用np.sqrt等向量化函数;浮点比较必须用math.isclose;整数运算优先用math.gcd/lcm;math.inf和math.nan是常量非字符串。

math 模块不支持 NumPy 数组,别直接传进去
工程里一上来就用 math.sqrt 处理数组,八成会报 TypeError: must be real number, not ndarray。这是因为 math 是纯标量函数,只认 Python 原生数字(int、float),不认 numpy.ndarray 或 list。
常见错误现象:把 Pandas Series 或 NumPy 向量直接塞给 math.log,结果崩在第一行。
- 用
numpy替代:改用np.sqrt、np.log等向量化函数 - 单值计算才用
math:比如配置解析、边界校验、初始化常量(math.pi、math.e) - 注意精度差异:
math.sqrt(2)和np.sqrt(2.0)结果一致,但后者能广播,前者不能
math.isclose 是浮点比较的唯一靠谱方式
写条件判断时用 == 比较两个浮点数,尤其涉及三角函数或除法后,大概率出错。比如 math.cos(math.pi / 2) == 0 返回 False,因为结果是极小非零值(约 6.12e-17)。
使用场景:数值收敛判断、单元测试断言、阈值触发逻辑。
立即学习“Python免费学习笔记(深入)”;
启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。
- 永远用
math.isclose(a, b, abs_tol=1e-9)替代a == b -
rel_tol适合相对误差大的场景(如大数相减),abs_tol更稳妥,尤其当 a 或 b 接近 0 - 别用
round(x, n) == round(y, n)模拟比较——它掩盖误差,且受浮点舍入规则干扰
math.gcd 和 math.lcm 在整数调度和配置规约中很实用
工程中常要算最小公倍数(比如多周期任务对齐)、最大公约数(比如缩放比例归一化),过去自己写欧几里得算法,现在直接用标准库就行,而且是 C 实现,快且稳。
参数差异:两个及以上整数都支持(Python 3.9+),但必须全为 int;传入浮点数会报 TypeError。
- 任务周期对齐:多个定时器周期(单位毫秒)取
math.lcm(300, 450, 600)得到共同触发间隔 - 图像缩放比例规约:原始宽高比
1920/1080→ 先转整数再用math.gcd(1920, 1080)得到60,约分为32/18→ 再约一次 - 注意负数:
math.gcd(-12, 8)返回4(结果恒为非负),符号不参与计算
math.inf 和 math.nan 不是字符串,别用引号包着
配置文件或 JSON 解析后手动赋值时,有人写 timeout = "math.inf" 或 default = "nan",结果后续做比较或运算直接失效——它们是内置常量,不是字面量字符串。
容易踩的坑:日志打印看起来像数字,但类型是 str;传给 requests 的 timeout 参数会静默转成 0。
- 正确写法:
timeout = math.inf,不是"math.inf" - 判断是否为 NaN 必须用
math.isnan(x),不能用x == math.nan(NaN 不等于任何值,包括自己) - 序列化时注意:
json.dumps({"val": math.inf})会报错,需预处理(如转None或字符串"Infinity")
真正难的不是记住函数名,而是每次做数值操作前,下意识问一句:这数据是标量还是批量?有没有精度陷阱?类型是不是我以为的那个?









