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
или передайте хотя бы одно неточное значение, чтобы получить неточное значение обратно.