2011-02-10 5 views
2

, 내가 R5RS의 다음 추출물에 대해 의아해되었다 (22-23 페이지) :계획 - 계획 R5RS을 구현하는 방법에 대해 생각하는 동안 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 및 (exact-> inexact (/ 6 4))가 정확하지 않더라도 구현은 정수 나누기, 소수로 진행하기 위해 정확한 등가물 (-4, 32 및 3/2)을 "기억"해야합니다 요인 분해 등?

그렇지 않으면 위의 답변을 제공 할 때 구현이 어떻게 성공할 수 있습니까?

미리 알려 주시면 감사하겠습니다. :)

니콜라스는 R5RS에 따라이 작업 주어진 부정확 한 결과를 확인하기 때문에 정확한 동등한 기억 이행을위한 필요가 없습니다

답변

1

는 부정확 한 피연산자를 포함한다. 예 :

> (+ -1.0 2) 
=> 1.0 

내부적으로 인터프리터는 float2를 업그레이드하고 수레에 대한 추가 작업을 호출 할 수 있습니다, 아무것도 기억 할 필요가 없다 : 사실상

/* 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의 굵은 글씨를 다시 보면 인터프리터는 예를 들어 (분모 (/ 1.0 3.0)) "부동"숫자에 대해 "정수"연산을 수행 할 수있는 것 같습니다. 이것은 나를 괴롭히는 것입니다. –

+0

@ Nicolas_75 :'(분모 (/ 1.0 3.0))'은 3.0을 반환 할 필요가 없습니다. 그리고 대부분의 구현에서 실제로 그렇지 않습니다. (라켓 5.0.2의 컴퓨터에서 얻은 결과는 18014398509481984.0입니다. 이해가 안되면 내 게시물을보십시오.) –

+0

지우기. 감사! :) –

1

인수의 원래 정확성을 "기억"할 필요가 없습니다. 계산 중에 숫자를 임시로 (내부적으로) 변환 할 수 있으며, 인수가 정확하지 않은 경우 결과를 부정확 한 태그로 지정할 수 있습니다.

예 :

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

(후자의 결과는 구현에 의존 내가 인용 수는 AMD64에서 실행 라켓 5.0.2에서 당신은 다른 구현에서 다른 결과를 얻을 수 있습니다...)

lurkers 및 archives의 경우 : 비정상적인 결과는 대부분의 구현에서 부정확 한 숫자에 IEEE 754를 사용하기 때문에 이진 부동 소수점 형식이므로 0.1을 완전 정밀도로 나타낼 수 없습니다 (단 10 진수 부동 소수점 형식 만 가능).

사실 구현에 십진 부동 소수점을 사용하지 않는 한 (inexact->exact 0.1)을 사용하면 1/10을 얻지 못할 것입니다.