私は現在、「プログラムの設計方法」をいじっています-Scheme/Racketを使用しています。私はSchemeのR5RSバージョンで本当に独特の機能に出くわしました。
小数点以下の精度の値を使用しているにもかかわらず、単純な減算を実行する場合、回答は予想されるものからわずかに外れます。
例えば; 次の減算演算が与えられます:
(- 5.00 4.90)
=> 0.09999999999999965
いつ確実にクリーンな0.10を期待すべきですか?整数の減算は期待どおりに機能します。
> (- 5 4)
=> 1
> (- 5 4.9)
=> 0.09999999999999965
たとえば、演習3.1.1:
次のステップは、各関数の例を作成することです。$ 3.00、$ 4.00、および$5.00のチケット価格でショーを購入できる参加者の数を決定します。例を使用して、チケット価格から参加者数を計算する方法を示す一般的なルールを作成します。必要に応じて、さらに例を作成します。
この例のルールでは、チケットの価格から$ 0.10を差し引くごとに、さらに15人が参加します。したがって、このようなクイック関数は機能します。
(define (attendees ticket-price)
(+ 120 (* (/ (- 5.00 ticket-price) 0.10) 15)))
ただし、これは(かなり迷惑な)を返します。
> (attendance 4.90)
=> 134.99999999999994
したがって、教科書の(ほぼ同じ)解決策を試した後。
(define (attendance price)
(+ (* (/ 15 .10) (- 5.00 price))
120))
まったく同じエラーが発生しました。これは私のローカルシステムに固有のものですか?私はかなり興味があります-実際には、これを修正するために何らかの形の丸めを使用することができます。しかし、なぜそれが最初に発生するのかを知りたいです!
それとは別に、Lispに興味のある人は誰でもHTDPを見るようにアドバイスします。それは、それをすくい取ると非常に穏やかなテキストのように見えます。私はSICPが好きですが、それはもっと長期的なことです。私は、読書、演習、そしてオンラインでの講義に追いつくために、良い数日を費やしているようです。HTDPはもう少し似ているようです'ああ、15分の余裕があります-HTDPを見てみましょう'。