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

基于针状三角形的向量夹角计算float64下返回NaN问题排查

异常成因

该问题是浮点数舍入误差在退化三角形场景下的典型表现,具体逻辑如下:

  • 你的测试用例中两个向量几乎完全沿x轴共线,理论夹角为0,对应的三角形三边长度len_a=1.0、len_b=0.008741225033460295、len_c=0.9912587749665397代数上完全满足len_a = len_b + len_c,属于共线的退化三角形。
  • float64仅能保留约16位十进制有效数字,当计算bar - (foo - baz)时,三个数值接近的浮点数连续做减法会产生灾难性抵消,代数上应为0的结果会出现极小的负偏移,你观测到的-1.38e-17就属于这类精度误差。
  • 该负误差会直接传导到分子计算环节,导致numerator变为负数,后续np.sqrt对负数求值自然返回nan。使用float128时精度足够,抵消了该类误差,因此问题消失。
修复方案

仅需在开平方操作前增加一行数值截断,消除浮点误差引入的异常负值即可,不会影响正常场景的计算精度:

mask = denominator > eps
angle = np.divide(numerator, denominator, where=mask)
# 新增:截断小于0的浮点误差值,合法结果本身不会小于0
angle = np.clip(angle, a_min=0.0, a_max=None, out=angle)
np.sqrt(angle, out=angle)

该修复完全符合算法的数学定义:合法非退化三角形对应的numerator/denominator值本身就在[0, 1]区间内,截断操作仅会消除浮点舍入带来的极小负误差,不会改变正常计算结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:54:02