64位浮点数下为什么sqrt(2^52+1)-sqrt(2^52)结果为0?
双精度浮点数规则下该计算现象的成因
直接整数减法得到1的原因
- 64位双精度浮点数的尾数包含52位显式存储位+1位隐含前导1,总共有53位二进制精度,可精确表示所有绝对值≤
2^53的整数。2^52和2^52+1都远小于2^53,二者都可以被无误差存储,因此直接做整数减法(2^52+1)-2^52可以得到精确结果1。
sqrt运算相减得到0的原因
sqrt(2^52)的结果是精确值2^26,无任何计算误差。- 对
sqrt(2^52 + 1),可用泰勒展开近似:当Δ远小于a时,sqrt(a²+Δ) ≈ a + Δ/(2a)。代入a=2^26、Δ=1,可得近似值为2^26 + 1/(2^27) = 2^26 + 2^-27。 - 双精度浮点数的最小可分辨间隔
eps(x)表示数值x附近两个相邻可表示浮点数的差值,计算公式为eps(x) = 2^(floor(log2(x)) - 52)。对于x=2^26,eps(2^26) = 2^(26 - 52) = 2^-26。 - 此时
sqrt(2^52+1)和2^26的差值刚好是eps(2^26)的一半,按照双精度默认的就近舍入、偶数优先规则,该值会被舍入到最近的可表示浮点数,也就是2^26本身。 - 因此
sqrt(2^52+1)的计算结果和sqrt(2^52)完全相等,二者相减自然得到0。
内容的提问来源于stack exchange,提问作者cantcode22
相关产品推荐
相关产品推荐

