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)
以与整数形成对比。
或者更确切地说,为什么 (= 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)
以与整数形成对比。