2

私は現在、「プログラムの設計方法」をいじっています-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を見てみましょう'。

4

2 に答える 2

6

浮動小数点数は、常に期待どおりの正確な値として格納されるとは限りません。たとえば、浮動小数点の危険性を参照してください。

正確な計算が必要な場合は、値をドルではなくセントで格納することにより、整数演算を使用できます。

(define (attendees ticket-price-cents)
  (+ 12000 (* (/ (- 500 ticket-price-cents) 10) 1500)))
于 2012-12-03T22:46:27.757 に答える
5

以前の(正しい)答えに加えて、あなたが本当に尋ねるべき質問は、「なぜこれは他の言語レベルでは起こらないのですか?」です。答えは次のとおりです。他の言語レベルの多くは、5.03を浮動小数点数ではなく、正確な数(500分の5)として解釈します。

JFYI!

于 2012-12-03T23:15:22.967 に答える