MIT Scheme Int VS Float
MIT Scheme Int VS Float
我一直在通过 SICP 使用 mit-scheme 来测试练习。在练习 1.8 中,你的任务是编写一个类似于给定平方根函数的立方根函数。我的解决方案如下;但是,我注意到在 cube-root 函数中,第一次调用 cube-iter 的地方。如果第一个参数是 1,函数 return 是一个非常大的整数,如果它是 1.0,它将 return 使用 mit-scheme 的预期结果。使用 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))
mit-scheme 中 (cube-iter 1 x)) 版本的输出:1592506 ......
mit-scheme 中 (cube-iter 1.0 x)) 版本的输出:3.0000005410641766
SCM 中 (cube-iter 1 x)) 版本的输出:3.0000005410641766
SCM 中 (cube-iter 1.0 x)) 版本的输出:3.0000005410641766
mit-scheme 的版本是 9.2
这不是一个大整数,它是一个很大的精确比率,如 1/2,非常接近 3
,比 3.0000005410641766
更准确。仔细观察,您会看到在分母和分母之间的 /
。
通过使用精确数字,支持完整数字塔的方案实现永远不会降低最常见数学运算的准确性,除非它天生就不精确,例如 log
。通过使用 one 像 1.0
这样的不精确值,所有结果都不精确,因为 1
是 1
而 1.0
在 1
。
因为你正在逼近立方根,我猜 1.0
是正确的使用值,因为结果已经足够好了,所以在这里返回确切的数字是不真实的。如果你正在做其他事情,结果是准确的,返回一个比率是正确的做法,那些不想要准确结果的人可以使用过程 exact->inexact
或传递至少一个不准确的值来获得一个返回不精确的值。
我一直在通过 SICP 使用 mit-scheme 来测试练习。在练习 1.8 中,你的任务是编写一个类似于给定平方根函数的立方根函数。我的解决方案如下;但是,我注意到在 cube-root 函数中,第一次调用 cube-iter 的地方。如果第一个参数是 1,函数 return 是一个非常大的整数,如果它是 1.0,它将 return 使用 mit-scheme 的预期结果。使用 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))
mit-scheme 中 (cube-iter 1 x)) 版本的输出:1592506 ......
mit-scheme 中 (cube-iter 1.0 x)) 版本的输出:3.0000005410641766
SCM 中 (cube-iter 1 x)) 版本的输出:3.0000005410641766
SCM 中 (cube-iter 1.0 x)) 版本的输出:3.0000005410641766
mit-scheme 的版本是 9.2
这不是一个大整数,它是一个很大的精确比率,如 1/2,非常接近 3
,比 3.0000005410641766
更准确。仔细观察,您会看到在分母和分母之间的 /
。
通过使用精确数字,支持完整数字塔的方案实现永远不会降低最常见数学运算的准确性,除非它天生就不精确,例如 log
。通过使用 one 像 1.0
这样的不精确值,所有结果都不精确,因为 1
是 1
而 1.0
在 1
。
因为你正在逼近立方根,我猜 1.0
是正确的使用值,因为结果已经足够好了,所以在这里返回确切的数字是不真实的。如果你正在做其他事情,结果是准确的,返回一个比率是正确的做法,那些不想要准确结果的人可以使用过程 exact->inexact
或传递至少一个不准确的值来获得一个返回不精确的值。