4

当我在球拍中尝试以下操作时:

(* 1.1 1.1)

为什么它会返回

1.2100000000000002

代替

1.21

尽管

(* 1.2 1.2) ; is 1.44, as expected

编辑

以下返回false:

(= (* 1.1 1.1) 1.21); #f
4

1 回答 1

9

哦,看,这比较正确!

> (= (* #e1.1 #e1.1) #e1.21)
#t

(Racket 有这个非常好的特性,#e1.1实际上在 1.1 中被准确地读入。其他 Scheme 实现不一定以这种方式工作,实际上可能#e1.1首先作为浮点读入,然后转换为精确值。)

无论如何,为了详细说明其他人的观点,在没有精确说明符的情况下,Scheme 将带有点的数字文字视为不精确†</sup> (也就是说,1.1#i1.1入相同的东西)。对于不精确的数字,在进行“精确”比较(例如 )时,您不能真正期待理智的结果=

†</sup> R7RS,第 6.2.5 节:“如果数字的书面表示没有精确前缀,则如果常数包含小数点或指数,则该常数是不精确的。否则,它是精确的。”

于 2013-08-26T05:09:12.867 回答