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 に答える