MIT计划Int VS Float

时间:2018-07-27 19:26:13

标签: types scheme sicp

我一直在使用mit-scheme通过SICP进行测试。对于练习1.8,您需要编写类似于给定平方根函数的立方根函数。我的解决方案如下;但是,我注意到在cube-root函数中,是第一次调用cube-iter。如果第一个参数为1,则该函数返回一个非常大的整数,如果为1.0,则它将使用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模式中(cube-iter 1 x))版本的输出:1592506 ......

mit模式中(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 个答案:

答案 0 :(得分:2)

这不是一个大整数,它是一个较大的精确比值,例如1/2,该值接近3,比3.0000005410641766更准确。仔细观察,您将看到分母和分母之间的/

通过使用精确数字,支持完整数字塔的方案实现永远不会降低最常见数学运算的精确性,除非它固有地不精确,例如log。通过使用一个不精确的值,例如1.0,由于11,而1.0处于{{1}范围内,因此所有结果都不精确}。

由于您逼近立方根,所以我猜1是可以使用的正确值,因为结果刚好足够,因此在此处返回准确的数字并不真实。如果您正在做其他事情,而结果是准确的,则返回比例是正确的事情,而那些不希望获得精确结果的人可以使用过程1.0或传递至少一个不精确的值来获得值返回不精确。