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

Intel Intrinsics Guide相对误差定义及零估计值场景疑问

Intel向量Intrinsics近似实现的误差定义(估计值为0的场景)

问题背景

不少Intel向量Intrinsics是近似实现,Intel Intrinsics Guide会标注最大相对误差,比如_mm256_rcp_ps的最大相对误差是1.5*2^-12。常规相对误差公式是relErr = abs((estVal-trueVal)/trueVal),但遇到极端情况就会失效:比如计算-1.11604e+38的倒数时,_mm256_rcp_ps返回-0.0,而真实值是约-8.96021e-39(属于非规格化浮点数),按公式算出来的相对误差是1,但实际上这个估计值的表现是符合预期的。这就引出两个问题:

  1. 当估计值为0时,该怎么衡量它的质量?
  2. Intel Intrinsics Guide里对这种场景的相对误差是怎么定义的?

估计值为0时的质量衡量

这种情况下,常规相对误差公式完全不适用——毕竟真实值趋近于0时,分母会让误差计算失去意义。更合适的衡量方式有两种:

  • 绝对误差:直接计算abs(estVal - trueVal)。比如这个例子里,绝对误差是8.96021e-39,和真实值的量级完全一致,说明这个0的估计是合理的——因为_mm256_rcp_ps本来就是针对规格化数优化的,非规格化数的倒数超出了常规规格化浮点数的表示范围,硬件返回0是符合设计逻辑的。
  • ULP误差:也就是看估计值和真实值之间差了多少个“最小精度单位”。单精度浮点数的非规格化数ULP是固定的2^-149,这个例子里真实值约为-2^-126,估计值是0,两者相差约2^-23个ULP,这个误差范围和_mm256_rcp_ps对规格化数的误差承诺是匹配的,说明硬件行为是一致的。

Intel Intrinsics Guide的误差定义规则

Intel官方的相对误差定义只针对规格化输入值——也就是当输入是符合浮点数规格化范围的数值时,才会用relErr = abs((estVal-trueVal)/trueVal)来约束误差。如果输入导致输出超出规格化范围(比如极大值的倒数变成非规格化数),官方的误差承诺会切换为两种方式:

  • 基于ULP的误差约束;
  • 直接说明硬件会返回最接近的可表示值。

回到你的例子:真实值-8.96021e-39比单精度规格化浮点数的最小可表示绝对值1.17549e-38还要小,属于非规格化数,而硬件返回的-0.0是最接近这个真实值的规格化浮点数,完全符合Intel的设计承诺。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:50:30