Код работает в stk-просто, но не в mit-схеме

Я читал на курсах CS61A (весна 2011 г.) от Berkeley Opencourseware и MIT 6.001 от OCW. Один использует STk (называется как stk-simply) и другие виды использования mit-scheme как язык программирования для лекций.

Я только что написал простую процедуру с квадратным корнем, используя метод Герона. Файл был сохранен как sqrt.scm

;; setting an accuracy or tolerance to deviation between the actual and the expected values
(define tolerance 0.001)

;; gives average of two numbers
(define (average x y)
  (/ (+ x y) 2))

;; gives the absolute values of any number
(define (abs x)
  (if (< x 0) (- x) x))

;; gives the square of a number
(define (square x) (* x x))

;; tests whether the guess is good enough by checking if the difference between square of the guess
;; and the number is tolerable
(define (good-enuf? guess x)
  (< (abs (- (square guess) x)) tolerance))

;; improves the guess by averaging guess the number divided by the guess
(define (improve guess x)
  (average (/ x guess) guess))

;;  when a tried guess does not pass the good-enuf test then the tries the improved guess
(define (try guess x)
  (if (good-enuf? guess x)
      guess
      (try (improve guess x) x)))

;; gives back square root of number by starting guess with 1 and then improving the guess until good-enuf
(define (sqr-root x)
  (try 1 x))

Это отлично работает в STk.

sam@Panzer:~/code/src/scheme$ sudo stk-simply
[sudo] password for sam: 
Welcome to the STk interpreter version 4.0.1-ucb1.3.6 [Linux-2.6.16-1.2108_FC4-i686]
Copyright (c) 1993-1999 Erick Gallesio - I3S - CNRS / ESSI <eg@unice.fr>
Modifications by UCB EECS Instructional Support Group
Questions, comments, or bug reports to <inst@EECS.Berkeley.EDU>.
STk> (load "sqrt.scm")
okay
STk> (sqr-root 25)
5.00002317825395
STk>

Но не в схеме.

sam@Panzer:~/code/src/scheme$ sudo scheme
[sudo] password for sam: 
MIT/GNU Scheme running under GNU/Linux
Type `^C' (control-C) followed by `H' to obtain information about interrupts.

Copyright (C) 2011 Massachusetts Institute of Technology
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Image saved on Thursday October 27, 2011 at 7:44:21 PM
  Release 9.1 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/i386 4.118 || Edwin 3.116

1 ]=> (load "sqrt.scm")

;Loading "sqrt.scm"... done
;Value: sqr-root

1 ]=> (sqr-root 25)

;Value: 1853024483819137/370603178776909

1 ]=> 

Я проверил руководства, но не смог найти причину. Кто-нибудь может дать мне знать, почему это? Или в коде есть ошибка, которую я игнорирую? Я новичок в обеих схемах и STk.

2 ответа

Решение

Попробуйте это, теперь код должен возвращать одинаковые результаты в обоих интерпретаторах (игнорируя крошечные различия округления):

(define (sqr-root x)
  (exact->inexact (try 1 x)))

Ответ был один и тот же, просто схема MIT по умолчанию дает точный результат, тогда как STk возвращает неточное значение. С помощью приведенного выше кода мы конвертируем результат в неточное число после выполнения расчета. В качестве альтернативы, мы могли бы выполнить преобразование с самого начала (возможно, потеряв некоторую точность в процессе):

(define (sqr-root x)
  (try 1 (exact->inexact x)))

Эта цитата объясняет наблюдаемое поведение:

Номера схем являются либо точными, либо неточными. Число является точным, если оно было записано как точная константа или было получено из точных чисел с использованием только точных операций. Число является неточным, если оно было записано как неточная константа, если оно было получено с использованием неточных ингредиентов, или если оно было получено с использованием неточных операций. Таким образом, неточность является заразным свойством ряда.

Вы бы оба ответа выглядели одинаково, если бы в MIT Scheme вы написали:

(sqr-root 25.)

поскольку "неточность" является "липкой"

Другие вопросы по тегам