Julia中isequal(0.6,0.5+0.1)与isequal(0.6,0.4+0.2)结果差异咨询
浮点数相等判断结果差异原因与Julia非精确比较方案
结果差异的核心原因
这个现象并非Julia独有,所有采用IEEE 754双精度浮点数规范的编程语言都会出现同类表现。
我们日常使用的十进制小数转换为二进制时,很多值是无限循环的,而浮点数的存储空间固定(双精度浮点数仅保留53位有效尾数),存储时必须对末尾位做舍入处理,天然存在微小的精度误差。
你测试的两组计算结果不同,本质是舍入后的位模式刚好有区别:
0.5是2的-1次幂,二进制表示完全精确;0.1的二进制表示虽然是无限循环值,但二者相加后的舍入结果,和直接字面量定义0.6的舍入位模式完全一致,因此isequal返回true。0.4和0.2的二进制表示均为无限循环值,二者相加后的舍入结果和直接存储的0.6存在1个最低位的差异,实际计算0.4 + 0.2得到的值是0.6000000000000001,和字面量0.6的位模式不完全相同,因此isequal返回false。
补充说明:普通正浮点数场景下==和isequal的判断逻辑一致,二者的区别仅在于isequal会将-0.0和0.0判定为不等、将两个NaN判定为相等,而==的判断规则相反。
Julia的非精确相等比较实现
Julia内置了专门的近似相等判断能力,无需引入第三方包:
- 基础用法是调用
isapprox()函数,也可以使用对应的运算符≈(REPL中输入\approx后按Tab键即可打出),函数会根据比较值的量级自动设置合理的相对、绝对容差,只要两个值的差值在容差范围内就会返回true:
julia> isapprox(0.6, 0.4 + 0.2) true julia> 0.6 ≈ 0.4 + 0.2 true
- 如果需要自定义判断精度,可以传入
atol(绝对容差)、rtol(相对容差)参数调整阈值,例如要求绝对误差不超过1e-9:
julia> isapprox(0.6, 0.4 + 0.2; atol=1e-9) true
内容的提问来源于stack exchange,提问作者Shayan
相关产品推荐
相关产品推荐

