2011-02-10 42 views
2

一邊想着實施方案R5RS的樣子,我就成了疑惑R5RS以下提取物(22-23頁):計劃 - 在R5RS數值塔「不精確」的概念

(餘-13 -4)==> -1
(餘數-13 -4.0)==> -1.0;不精確

(LCM 32 -36)==> 288
(LCM 32.0 -36)==> 288.0;不精確

(分母(/ 6 4))==> 2
(分母(exact->不精確(/ 6 4)))==> 2.0

我們應該明白,即使-4.0,32.0和(精確 - >不精確(/ 6 4))是不精確的,實現將「記住」它們的精確等價(-4,32和3/2)以進行整數除法,prime因素分解等?

否則,實現如何成功地提供上述答案?

在此先感謝您提供的任何光線! :)

薩科

回答

1

沒有必要實施,記得確切的等效的,因爲按照R5RS它是確定生產給定的操作不精確的結果中包含不準確的操作。例如:

> (+ -1.0 2) 
=> 1.0 

內部,解釋器可以升級2float並呼籲花車加法運算,沒有必要記住任何東西:

/* Assuming that the interpreter implements primitive operations in C. */ 
SchemeObject* addInts(SchemeObject* a, SchemeObject* b) 
{ 
    if (a->type == FLOAT || b->type == FLOAT) 
    { 
     cast_int_value_to_float (a); 
     cast_int_value_to_float (b); 
     return addFloats (a, b); 
    } 
    return make_new_int_object (get_int_value (a) + get_int_value (b)); 
} 

實際上,上述加法方案被翻譯處理爲:

> (+ -1.0 2.0) 
=> 1.0 
+0

感謝您的回答。我完全同意你的看法。但是,如果再次以粗體顯示R5RS的摘錄,解釋程序似乎能夠對「float」不精確的數字執行「整數」運算,例如(分母(/ 1.0 3.0))。這讓我感到困惑。 – 2011-02-10 12:34:32

1

它不必「記住」參數的原始正確性。它可以在計算過程中臨時(內部)將數字轉換爲精確值,並且如果任何參數不精確,則將結果標記爲不精確。

例子:

(denominator 1/10) ; 10 
(denominator 0.1) ; 3.602879701896397e+16 

(後者的結果是依賴於實現我引用的數字是從球拍5.0.2 AMD64上運行你會從其他實現得到不同的結果。)

對於潛伏者和檔案庫:這種看起來不尋常的結果是因爲大多數實現使用IEEE 754的不精確數字(二進制​​浮點格式)不能以全精度(只有十進制浮點格式)表示0.1。

實際上,如果您使用(inexact->exact 0.1),除非您的實現使用十進制浮點數,否則您將不會得到1/10