标准正态分布CDF两种实现的精度切换区间查询
标准正态分布CDF高精度实现的公式选择范围
首先明确两个公式的理论等价性:由于erfc(z) = 1 - erf(z),理论上(1 + erf(x/√2))/2与(2 - erfc(x/√2))/2完全等价,但浮点数有限精度下,两者会因消去误差产生精度差异。
核心分析:浮点数消去误差的影响
浮点数计算中,两个数值相近的数做加减运算时,会丢失有效数位,导致精度骤降。我们基于这一点分析不同x区间的情况:
1. x < 0的场景
当x为负数时,z = x/√2也是负数:
- 对于公式
(1 + erf(z))/2:erf(z) = -erf(-z),代入后得到(1 - erf(-z))/2。当|x|增大(x越负),erf(-z)趋近于1,此时1 - erf(-z)是两个接近1的数相减,触发严重消去误差,得到的Φ(x)(小数值)精度会大幅下降。 - 对于公式
(2 - erfc(z))/2:高质量数学库会利用erfc(z) = 2 - erfc(-z)的对称性计算负z的erfc值。当|x|增大时,erfc(-z)趋近于0,因此erfc(z)趋近于2,2 - erfc(z)直接得到一个小正数,再除以2就是Φ(x)的准确值,完全避免了消去误差,精度更高。
2. x ≥ 0的场景
当x非负时,z = x/√2也非负:
此时两个公式在数值计算上等价((2 - erfc(z))/2 = (1 + erf(z))/2),且1 + erf(z)的计算不存在消去误差(erf(z)从0到1,相加结果从1到2)。高质量数学库的erf和erfc实现会保证两者的精度基本一致,无需区分选择。
结论
(2 - erfc(x/√2))/2比(1 + erf(x/√2))/2精度更高的x取值范围是所有x < 0的情况,且x的绝对值越大,精度优势越显著;x ≥ 0时两者精度无明显差异。
内容的提问来源于stack exchange,提问作者Raymond Hettinger
相关产品推荐
相关产品推荐

