【问题标题】:What's the meaning of `indistinguishable` in Emacs Lisp?Emacs Lisp 中“不可区分”是什么意思?
【发布时间】:2021-03-29 03:39:45
【问题描述】:

我正在阅读一个名为 eql 的 Emacs Lisp 函数的文档:

Return t if the two args are eq or are indistinguishable numbers.

这里的indistinguishable是什么意思?我一直在搜索文档,但没有找到解释。

【问题讨论】:

  • 表示数值相等。
  • 这个词是按照正常的英文意思使用的,这不是他们需要定义的技术术语。
  • @Drew -- eq 用于“无法区分为 lisp 对象”;无法区分的数字不一定是相同的对象,这就是为什么 eql 扩展 eq 以容纳数字。
  • 对不起;是的,我的意思是 eq 的评论。
  • @Barmar 这并不意味着数值相等,因为 1 和 1.0 在数值上相等,但可以区分。为了完全准确,文档应该说类似“相同数字的无法区分的表示”。

标签: emacs lisp elisp


【解决方案1】:

eq 谓词仅在比较相同对象时返回t。但是两个比较相等的值不能保证是同一个对象;两个具有相同值的文字甚至不能保证是同一个对象。因此,(eq 1 1) 可能会或可能不会评估为 t。对于数字类型eql 比较值,因此(eql 1 1) 将始终评估为t。但是,eql 更微妙一些:(eql 1 1.0) 将评估为 'nil,因为 11.0 不是无法区分的,即它们不共享相同的类型。因此,在引用的上下文中,不可区分意味着操作数具有相同的类型和相同的值。

【讨论】:

  • 我发现(eql +0.0 -0.0) 评估为nil。怎么会这样? +0.0-0.0 是相同的类型和相同的值。如果 indistinguishable 表示相同的类型和相同的值,则 (eql +0.0 -0.0) 的计算结果应为 t
  • IEEE 浮点 0.0 和 -0.0 具有不同的位模式。 Elisp 手册说they are =, but some operations can distinguish between them。大概eql 是这些操作之一。 0.0 和 -0.0 数值相等,但它们的值不同。看到这一点的一种方法是观察 1.0 / 0.0 => 无穷大,但 1.0 / -0.0 => -infinity。
  • 当我在 Elisp 缓冲区中评估 (/ 1.0 0.0) 时,我得到 1.0e+INF,而评估 (/ 1.0 -0.0) 产生 -1.0e+INF。如果0.0-0.0 是相同的值,则这些结果应该一致。
猜你喜欢
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多