You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何NumPy float32可返回小于IEEE-754最小值的数值?

NumPy float32极小值现象的原因解析

你的观察完全符合IEEE-754单精度浮点数标准,NumPy的float32并没有违背标准,核心原因是**非正规数(亚正规数)**的存在:

  • IEEE-754单精度浮点数分为两类:正规数和非正规数。你提到的2^-126≈1.18e-38是正规数的最小值,这类数的指数位取值范围为1~254,隐含固定的最高位1,保证全精度的尾数表示。
  • 当指数位全为0时,浮点数进入非正规数模式:此时隐含的指数不再是正规数的-126,而是-127,且尾数不再隐含最高位1,直接用存储的二进制位表示。这使得非正规数能表示比2-126更小的数值,单精度非正规数的最小值约为2-149≈1.4e-45,这就是你测试中到1e-46左右才会被截断为0的原因。
  • 非正规数参与计算时,尾数的有效位数会减少,因此会出现明显的截断误差(比如你测试的np.float32(2*1e-45)输出偏差),这是标准允许的行为——非正规数的设计目的就是避免数值下溢直接跳变到0,提供渐变的下溢过渡。
  • 至于print(np.float32(1e-39))输出1e-39,是因为NumPy在打印浮点数时,会输出与内部存储值最接近的十进制近似值,而非严格的二进制精确表示,看起来像是存储了原数值,实际是用非正规数近似表示的结果。

内容的提问来源于stack exchange,提问作者Plagioclase

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:31:02