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

时间:2015-03-07 17:13:40

标签: floating-point scheme lisp

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

1 个答案:

答案 0 :(得分:7)

在Scheme术语中,

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

另一方面,

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

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