
嵌入式语言运行时编程语言解释器编译器物联网系统编程【免费下载链接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems项目地址https://gitcode.com/gh_mirrors/mi/micropython点击查看免费下载导读math是 MicroPython 内置的标准数学模块为单片机与资源受限系统上的浮点运算提供了一整套基础函数——从三角函数、指数对数到取整、符号处理与特殊函数误差函数、伽马函数再到e、pi等常用常量。本文以官方文档 docs/library/math.rst 为骨架结合核心实现 py/modmath.c 与 tests/float 目录下的测试用例逐一讲解每个函数的行为、参数、返回值与边界情况并深入说明模块的编译期裁剪机制、错误处理策略与浮点精度差异。读完本文你将能够在任意 MicroPython 端口上正确、高效地使用math模块完成传感器数据处理、姿态解算、信号滤波等数值计算任务。模块概述与适用前提math模块提供用于处理浮点数的基本数学函数。使用前需要明确以下几点约束浮点支持是硬前提该模块依赖 MicroPython 的浮点实现因此仅在启用了浮点支持的构建中可用见 py/modmath.c 中的编译条件MICROPY_PY_BUILTINS_FLOAT MICROPY_PY_MATH。平台可用性模块在 WiPy 端口上不可用pyboard 上的浮点数是32 位精度计算结果的精度与舍入行为会与桌面 CPython64 位 double存在差异。ROM 裁剪模块主体默认随CORE_FEATURES及以上 ROM 级别启用而部分扩展功能常量、特殊函数、factorial、isclose默认随EXTRA_FEATURES及以上级别启用具体宏定义见 py/mpconfig.h。关于浮点精度可以从配置宏看出 MicroPython 支持三种浮点实现MICROPY_FLOAT_IMPL_NONE无浮点、MICROPY_FLOAT_IMPL_FLOAT32 位单精度C 函数调用xxxf后缀版本、MICROPY_FLOAT_IMPL_DOUBLE64 位双精度见 py/mpconfig.h。pyboard 等部分端口选择单精度以节省存储与计算开销这也是文档特别提示 32-bit precision 的原因。常用函数详解以下函数大多直接映射到 C 标准库math.h的对应实现通过math_generic_1/math_generic_2包装器完成参数转换、结果校验与异常处理见 py/modmath.c。三角函数与反三角函数函数说明acos(x)返回x的反余弦asin(x)返回x的反正弦atan(x)返回x的反正切atan2(y, x)返回y/x的反正切主值注意参数顺序为 y 在前与 C 的atan2一致cos(x)返回x的余弦sin(x)返回x的正弦tan(x)返回x的正切实现要点atan2在启用MICROPY_PY_MATH_ATAN2_FIX_INFNAN时会对双无穷输入做修正将atan2(±inf, ±inf)归一到π/4或3π/4的主值范围内避免某些平台 libm 返回 NaN见 py/modmath.c。tests/float/math_domain.py中对atan2与inf/nan的组合进行了系统性回归测试。双曲函数特殊函数cosh(x)、sinh(x)、tanh(x)以及反双曲acosh(x)、asinh(x)、atanh(x)均属于特殊函数分组受MICROPY_PY_MATH_SPECIAL_FUNCTIONS宏控制默认随EXTRA_FEATURES级别启用在 py/modmath.c 中集中注册。tests/float/math_fun_special.py覆盖了这些函数的正负值、边界值与大值如tanh(±1e6)测试。指数与对数函数说明exp(x)返回x的指数e 的 x 次幂expm1(x)返回exp(x) - 1对接近 0 的 x 具有更高精度属于特殊函数log(x)/log(x, base)单参数返回x的自然对数双参数返回以base为底的对数log2(x)返回以 2 为底的对数log10(x)返回以 10 为底的对数log的两种调用形态是该模块少数变参函数之一其实现见 py/modmath.c需要注意其错误处理与 CPython 的差异x 0或base 0时抛出ValueError(math domain error)base 1时抛出ZeroDivisionError(divide by zero)双参数形式实际计算log(x) / log(base)因此当base 1时等价于除零。注意CPython 中math.log(x, base)使用log(x)/log(base)且允许base 1得到nan/异常MicroPython 这里选择直接抛ZeroDivisionError行为略有差异测试见 tests/float/math_fun.py。log2的替代实现当目标平台 libm 缺少log2宏MP_NEED_LOG2生效时MicroPython 用log(x) * 1.442695040888963407354163704即1/ln2近似实现见 py/modmath.c保证跨平台一致性。幂与根sqrt(x)返回x的平方根。对负数输入包装器会将其从 C 的nan结果转换为ValueError。pow(x, y)返回x的y次幂。启用MICROPY_PY_MATH_POW_FIX_NAN时做了特殊处理pow(1, anything) 1、pow(anything, 0) 1即使另一个参数是 NaN 也成立见 py/modmath.c使语义与 IEEE 754 一致。取整与符号函数说明ceil(x)返回向正无穷方向取整的整数floor(x)返回向负无穷方向取整的整数trunc(x)返回向0方向取整截断的整数fabs(x)返回x的绝对值copysign(x, y)返回带有y的符号的x取整三兄弟的区别可以这样记忆ceil(-1.5) -1floor(-1.5) -2trunc(-1.5) -1。三者均由MATH_FUN_1_TO_INT宏包装返回 MicroPython 整数对象见 py/modmath.c。copysign在启用MICROPY_PY_MATH_COPYSIGN_FIX_NAN时会把 NaN 符号参数当作0.0处理见 py/modmath.c。浮点分解与合成frexp(x)将浮点数分解为尾数与指数返回元组(m, e)满足x m * 2**e精确成立当x 0时返回(0.0, 0)否则满足0.5 abs(m) 1。ldexp(x, exp)返回x * (2**exp)是frexp的逆运算注意第二个参数是整数。modf(x)返回元组(frac, int)分别为x的小数部分与整数部分两个返回值都与x同号。启用MICROPY_PY_MATH_MODF_FIX_NEGZERO时会保留-0.0的负号见 py/modmath.c。这三个函数在tests/float/math_fun.py中被归为 tuple_functions 测试组逐值校验返回元组的两个分量。余数fmod(x, y)返回x/y的余数遵循 C 语义结果与x同号。启用MICROPY_PY_MATH_FMOD_FIX_INFNAN时当x有限而y为无穷时直接返回x避免部分平台返回 NaN见 py/modmath.c。角度换算degrees(x)弧度转角度实现为x * (180.0 / π)。radians(x)角度转弧度实现为x * (π / 180.0)。两者的常量MP_PI在模块内显式定义为3.14159265358979323846并带有MICROPY_FLOAT_CONST精度适配见 py/modmath.c单精度构建下会自动转成float常量。数值状态判定isfinite(x)x有限时返回True。isinf(x)x为无穷正或负时返回True。isnan(x)x为 NaN非数值时返回True。这三个谓词由MATH_FUN_1_TO_BOOL宏实现见 py/modmath.c不参与math_generic_1的错误检查因此对任何输入都不会抛异常——这与 CPython 一致适合在数据校验流程中安全使用。误差函数与伽马函数特殊函数erf(x)误差函数统计学与信号处理中常用。erfc(x)互补误差函数即1 - erf(x)对大的x精度更高。gamma(x)伽马函数阶乘在实数域的推广。lgamma(x)伽马函数绝对值的自然对数。以上四个函数仅在MICROPY_PY_MATH_SPECIAL_FUNCTIONS启用时提供见 py/modmath.c。gamma在启用MICROPY_PY_MATH_GAMMA_FIX_NEGINF时对负无穷输入会直接抛ValueError见 py/modmath.c。tests/float/math_fun_special.py对它们进行了覆盖包括gamma(50.0)、lgamma(100.0)等较大输入。其它实用函数isclose(a, b, *, rel_tol1e-9, abs_tol0.0)判断两个浮点数是否足够接近用于规避浮点误差导致的等值比较失败。仅接受关键字参数rel_tol相对容差默认1e-9与abs_tol绝对容差默认0.0当rel_tol或abs_tol为负时抛ValueError见 py/modmath.c。该函数仅在启用MICROPY_PY_MATH_ISCLOSE时可用测试见 tests/float/math_isclose.py。factorial(x)返回非负整数x的阶乘对负数抛ValueError。当MICROPY_OPT_MATH_FACTORIAL开启时使用分治递归乘法对大数更快否则使用平方差优化算法见 py/modmath.c。测试见 tests/float/math_factorial_intbig.py。常量常量说明e自然对数的底约 2.718281828pi圆周率约 3.141592654在启用MICROPY_PY_MATH_CONSTANTS的构建中还额外提供三个常量见 py/modmath.c常量说明tau圆周率的两倍2πinf正无穷nan非数值常量值的精度由构建的浮点实现决定。测试 tests/float/math_constants.py 通过十六进制位模式精确校验单精度e 0x402DF854、pi 0x40490FDB与双精度e 0x4005BF0A8B145769、pi 0x400921FB54442D18下常量的位级正确性。错误处理机制统一包装与域错误math模块的核心设计是统一包装器 统一错误语义。绝大多数一元函数经由math_generic_1调用二元函数经由math_generic_2调用见 py/modmath.c其工作流程为用mp_obj_get_float把传入的 MicroPython 对象整数、浮点数、布尔值等转换为内部mp_float_t调用 C 库函数计算结果结果校验如果结果为 NaN 但输入不是 NaN或结果为无穷但输入不是无穷则说明发生了数学域错误统一抛出ValueError(math domain error)见 py/modmath.c 的math_error。这套校验的意义在于C 库在不同平台上的行为并不统一有的返回 NaN、有的设置 errno、有的抛 SIGFPEMicroPython 通过包装层将其归一为可捕获的 Python 异常。tests/float/math_domain.py针对fabs/ceil/floor/trunc/sqrt/exp/log/sin/cos/tan/asin/acos/atan/ldexp/radians/degrees及pow/log/fmod/atan2/copysign用0/1/±1.12/±inf/nan等输入逐项验证了ValueError与OverflowError的触发路径。import math # 输入校验整数/浮点/布尔都可接受 print(math.sqrt(4)) # 2.0 print(math.ceil(3.2)) # 4 # 域错误统一抛 ValueError try: math.sqrt(-1) except ValueError as e: print(e) # math domain error try: math.log(0) except ValueError as e: print(e) # math domain error # log 的 base 1 是除零 try: math.log(2, 1) except ZeroDivisionError as e: print(e) # divide by zero # 浮点比较推荐使用 isclose print(math.isclose(0.1 0.2, 0.3, rel_tol1e-9)) # True编译期裁剪按需控制模块体积math模块是可裁剪的所有相关配置宏集中定义于 py/mpconfig.h构建时可按需开关以平衡功能与固件体积配置宏默认值控制内容MICROPY_PY_MATHCORE_FEATURES级别模块主体基础函数 e/piMICROPY_PY_MATH_CONSTANTSEXTRA_FEATURES级别tau、inf、nan常量MICROPY_PY_MATH_SPECIAL_FUNCTIONSEXTRA_FEATURES级别双曲函数族、expm1、log2、log10、erf、erfc、gamma、lgammaMICROPY_PY_MATH_FACTORIALEXTRA_FEATURES级别factorialMICROPY_PY_MATH_ISCLOSEEXTRA_FEATURES级别iscloseMICROPY_PY_MATH_ATAN2_FIX_INFNAN0关闭atan2的无穷输入修正MICROPY_PY_MATH_FMOD_FIX_INFNAN0关闭fmod的无穷输入修正MICROPY_PY_MATH_MODF_FIX_NEGZERO0关闭modf保留负零符号MICROPY_PY_MATH_POW_FIX_NAN0关闭pow的 NaN 语义修正MICROPY_PY_MATH_GAMMA_FIX_NEGINF0关闭gamma负无穷抛错前六个宏默认与 ROM 配置级别CORE_FEATURES/EXTRA_FEATURES绑定后五个为平台级微调宏各端口可在mpconfigport.h中按需覆盖。这也是为什么文档中的函数清单在部分精简构建上并非全部可用——例如裸机小内存端口可能不提供特殊函数而tests/float/math_fun_special.py正是用try: from math import *; erf的方式先探测功能存在性再执行。与 CPython 的差异速览行为CPythonMicroPython浮点精度通常 64 位 double视端口而定pyboard 为 32 位单精度math.log(x, 1)返回nan/ZeroDivisionError视版本明确抛ZeroDivisionErrormath.pow(1, nan)平台相关启用修正宏后恒为1.0错误消息版本间有差异统一为math domain error部分版本做了 CPython 3.14 消息的兼容归一见 tests/float/math_fun.py模块裁剪不可裁剪通过配置宏按需编译完整函数速查表以下为模块提供的全部函数粗体为受SPECIAL_FUNCTIONS或其它宏控制的扩展项一元基本函数acos、asin、atan、atan2(y, x)、ceil、copysign(x, y)、cos、degrees、exp、fabs、floor、fmod(x, y)、frexp、ldexp(x, exp)、log(x[, base])、modf、pow(x, y)、radians、sin、sqrt、tan、trunc、isfinite、isinf、isnan扩展特殊函数acosh、asinh、atanh、cosh、sinh、tanh、expm1、log2、log10、erf、erfc、gamma、lgamma扩展实用函数isclose(a, b, *, rel_tol1e-9, abs_tol0.0)、factorial(x)常量e、pi扩展tau、inf、nan模块的完整注册表函数名到实现对象的映射见 py/modmath.c。如需在实际固件上验证各函数行为可参考 tests/float/math_fun.py、tests/float/math_fun_special.py、tests/float/math_domain.py 与 tests/float/math_isclose.py 等测试用例它们覆盖了常规值、边界值、无穷与 NaN 输入、错误路径与常量位级精度是理解本模块行为的权威参考。赞分享嵌入式语言运行时编程语言解释器编译器物联网系统编程【免费下载链接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems项目地址https://gitcode.com/gh_mirrors/mi/micropython点击查看免费下载相关推荐CPython math 模块完全指南浮点数学函数、常量、特殊值与实现原理CPython math 模块完全指南浮点数学函数、常量、特殊值与实现原理 math 是 Python 标准库中最基础也最常用的模块之一它以 Python编程语言语言运行时解释器标准库MicroPython 内置函数与内置异常完全指南builtins 模块源码级解析MicroPython 内置函数与内置异常完全指南 builtins 模块源码级解析 导读 本文以 MicroPython 官方文档 docs/library嵌入式语言运行时编程语言解释器编译器物联网系统编程RPCS3 PS3 模拟器中文补丁安装全流程从下载到汉化生效新手一次搞定的实战指南RPCS3 PS3 模拟器中文补丁安装全流程从下载到汉化生效新手一次搞定的实战指南 玩 RPCS3 这个 PS3 模拟器时你大概率遇到过这样的场景游戏里虚拟化图形学调试器上一篇华硕笔记本性能调优革命G-Helper轻量控制工具完全指南下一篇Ising-Decoder-SurfaceCode-1-Accurate路线图未来版本更新与功能展望创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考