为什么在Scheme / Dr中有(max(sin(/ 5 3))(sqr 12))。球拍(初学者语言)被评为不精确?

时间:2014-08-01 07:18:06

标签: functional-programming scheme lisp racket inexact-arithmetic

我正在阅读如何设计程序,在练习2.1.1中,我是:

  

了解DrScheme是否有对数字进行平方的操作;用于计算角度的正弦;并确定两个数字的最大值。 - 秒2.2,ex 2.1.1

我的代码是:

(sin (/ 5 3))
(sqr 12)
(max (sin (/ 5 3)) (sqr 12))

我运行程序的结果是:

#i0.9954079577517649
144
#i144.0

我对最后一个表达式感到困惑,因为它得到#i0.9954079577517649144的最大值。答案不应该是144144.0而不是#i144.0吗?

1 个答案:

答案 0 :(得分:2)

如果max(或其他操作)的任何一个输入都不准确,

Scheme会给你一个不精确的数字。

标准文档R5RS在讨论6.2.5 Numerical operationsmin时在max部分中说明了这一点:

  

注意:如果任何参数不精确,那么结果也将是不精确的(除非该过程可以证明不准确性不足以影响结果,这只有在异常实现中才有可能)。

现在可能会出现144远大于0.9954079577517649的情况,但这取决于级别后一个数字的不准确性。如果不准确度大约为10亿,那么它可能远远大于144: - )

该标准的6.2.2 Exactness部分也有:

  

方案编号是精确的还是不精确的。如果数字被写为精确常数或仅使用精确操作从精确数字导出,则数字是精确的。

     

如果一个数字被写为不精确的常量,如果使用不精确的成分派生,或者如果它是使用不精确的操作派生的话,则该数字是不精确的。

     

因此,不精确是一个数字的传染性财产。

0.99 - ish数字是不精确的,因为正弦和许多其他三角函数本质上是不精确的操作。 max的结果是不精确的,因为它有不精确的输入。