Lisp:为什么 (- 1e16 1) 产生 10000000000000000 而不是 9999999999999999?

Lisp: Why does (- 1e16 1) yield 10000000000000000 not 9999999999999999?

或者更确切地说,为什么 (= 1e16 (- 1e16 1)) return 是真的?我怎样才能得到更准确的答案?

1e16 在 Scheme 术语中是一个不精确的数字(或者更实际的术语是浮点数)。对于大于 253 (9007199254740992) 的(双精度)浮点数,ulp 大于 1,这意味着 1 的变化太小而无法表示。

另一方面,

10000000000000000 是一个整数。如果你做(- 10000000000000000 1),你确实会得到999999999999999。在Scheme中,你也可以写#e1e16来表示相同的数量; #e 前缀使数字精确(在 Scheme 术语中;实际上,它表示整数或有理数)。

† 尝试评估 (+ 9007199254740992.0 1)(- 9007199254740992.0 1),然后尝试评估 (+ 9007199254740992 1)(- 9007199254740992 1) 以与整数形成对比。