ラケットで次のことを試してみると:
(* 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
ほら、これは正しく比較されます!
> (= (* #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: 「数値の記述表現に正確さの接頭辞がない場合、小数点または指数が含まれている場合、定数は不正確です。それ以外の場合、正確です。」