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

vxs*_*122 0 lisp floating-point scheme

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

Chr*_*ung 7

1e16就Scheme而言,是一个不精确的数字(或者更实际的说,是一个浮点数).对于(双精度)浮点数高于2 53(9007199254740992),ulp大于1,这意味着1的变化太小而无法表示.

另一方面,10000000000000000是一个整数.如果你这样做(- 10000000000000000 1),你的确会回来999999999999999.在Scheme中,你也可以写#e1e16代表相同的数量; 的#e前缀使确切的数目(在方案范围;在实践中,这意味着一个整数或理性).

†请评价(+ 9007199254740992.0 1)(- 9007199254740992.0 1),然后请评价(+ 9007199254740992 1),并(- 9007199254740992 1)与整数对比.