MIT Scheme Int VS Float

Я работал через SICP, используя мит-схему для проверки упражнений. В упражнении 1.8 вам поручено написать функцию кубического корня, аналогичную данной функции квадратного корня. Мое решение для этого ниже; Тем не менее, я заметил, что в функции кубического корня, где выполняется первый вызов cube-iter. Если первый аргумент равен 1, функция возвращает очень большое целое число, где, если оно равно 1,0, она вернет ожидаемый результат, используя mit-схему. При использовании интерпретатора scm нет разницы между выводом при использовании 1 и 1.0. У меня сложилось впечатление, что между ними не должно быть никакой разницы.

Код:

(define (cube-root x)
  (cube-iter 1 x))

(define (cube-iter guess x)
  (if (good-enough? guess x)
      guess
      (cube-iter (improve guess x) x)))

(define (good-enough? guess x)
  (< (abs ( - x (cube guess))) .001))

(define (improve guess x)
  (/ (+ (/ x (* guess guess)) (* 2 guess))
   3)))

(define (cube x) (* x x x))

Выход для версии (cube-iter 1 x) в мит-схеме: 1592506......

Выход для версии (cube-iter 1.0 x) в мит-схеме: 3.0000005410641766

Выход для версии (cube-iter 1 x) в SCM: 3.0000005410641766

Выход для версии (cube-iter 1.0 x) в SCM: 3.0000005410641766

Версия для мит-схемы 9.2

1 ответ

Решение

Это не большое целое число, это большое точное число типа 1/2, которое чертовски близко к 3 и точнее, чем 3.0000005410641766, Присмотритесь повнимательнее, и вы увидите / между знаменателем и знаменателем.

Используя точные числа, реализация схемы, которая поддерживает полную числовую башню, никогда не уменьшит точность для наиболее распространенных математических операций, если она не является наследственно неточной, как log, Используя одно неточное значение, такое как 1.0 и все результаты неточны, так как 1 является 1 в то время как 1.0 находится в диапазоне вокруг 1,

Так как вы аппроксимируете кубический корень, я думаю, 1.0 это правильное значение для использования, так как результат достаточно хорош, поэтому возвращение точных чисел здесь не является правдивым. Если вы делали что-то еще, где результат был точным, возвращение отношения - это правильное решение, и те, кто не хочет получить точный результат, могут использовать процедуру exact->inexact или передайте хотя бы одно неточное значение, чтобы получить неточное значение обратно.

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