为什么(max (sin (/ 5 3)) (sqr 12))在Scheme/Dr.球拍(初级学生语言)被评价为不准确



我正在阅读如何设计程序,在练习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吗?

如果max(或其他相关操作)的输入不精确,Scheme将给您一个不精确的数字。

标准文档R5RS在讨论minmax时在6.2.5 Numerical operations节中有这样的说法:

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

现在可能有一种情况,1440.9954079577517649大得多,但这取决于后一个数字的水平的不准确性。如果不准确性在十亿分之一的数量级,它很可能比144大得多:-)

该标准的6.2.2 Exactness节也有这个:

方案编号可以是精确的,也可以是不精确的。一个数字是精确的,如果它被写成一个精确的常数,或者是由精确的数字通过精确的运算得到的。

如果一个数被写成不精确的常量,如果该数是通过不精确的成分导出的,或者是通过不精确的操作导出的,那么这个数就是不精确的。

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

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

最新更新