Emacs Lisp中eql函数文档的indistinguishable含义是什么?
Emacs Lisp
eql函数中indistinguishable的具体含义 查阅Emacs Lisp中内置eql函数的文档时,你会看到官方给出的判定逻辑说明:
Return t if the two args are eq or are indistinguishable numbers.
很多人检索完相关配套文档都找不到这里indistinguishable的明确定义,它的实际指代可以从Emacs Lisp的实际运行逻辑拆解:
这里的indistinguishable numbers,特指两个数字在实际使用场景下不存在任何可观测、可感知差异的等价关系,而非要求两个数字必须是同一类型、存储在同一块内存地址上。
具体的判定规则可以归纳为几点:
- 它补全了
eq函数对数字判定的局限性:eq只会比对两个对象的内存地址,哪怕两个数字的数值完全相同,只要创建的时机不同、内存地址不一样,eq就会返回nil;而eql针对数字场景,会跳过地址比对,直接做数值层面的等价判断。 - 判定的核心边界是“是否存在可观测差异”:
- 如果两个数字不管类型是整数还是浮点数,在当前环境的精度配置下,做任何运算、对比操作都不会产生不同的结果,就属于
indistinguishable的范畴。 - 如果两个数字存在哪怕极其微小的精度偏差,只要这个偏差可以被运算、对比逻辑检测到,就不属于不可区分的数字。
- 如果两个数字不管类型是整数还是浮点数,在当前环境的精度配置下,做任何运算、对比操作都不会产生不同的结果,就属于
- 举两个实际的交互示例:
- 执行
(eql 1 1.0)会返回t,因为整数1和能被当前精度无损表示的浮点数1.0,在所有数字运算场景下都没有可感知差异,符合不可区分的判定。 - 执行
(eql 0.1 0.1000000000000001)会返回nil,因为两个值存在可被检测的精度差,不属于不可区分的范畴。
- 执行
至于官方文档为什么要用indistinguishable这种偏模糊的表述,本质是因为这个判定的边界跟当前Emacs的数值实现、浮点精度配置直接相关,没有写死的固定判定阈值,所以从实际使用感知的角度做了描述,没有罗列具体的类型、精度判定细则。
内容的提问来源于stack exchange,提问作者Searene
相关产品推荐
相关产品推荐

