或者更确切地说,为什么(= 1e16 (- 1e16 1))
会返回true?我怎样才能收到更准确的答案?
答案 0 :(得分:7)
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)
与整数形成对比。