2

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

找出 DrScheme 是否有平方数的运算;用于计算角度的正弦值;并用于确定两个数字的最大值。- 秒。2.2,前 2.1.1

我的代码是:

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

我运行程序时的结果是:

#i0.9954079577517649
144
#i144.0

我对最后一个表达式感到困惑,它是#i0.9954079577517649and的最大值144。答案不应该是144还是144.0代替#i144.0

4

1 回答 1

2

max如果任何一个输入(或其他操作)不准确,Scheme 会给你一个不准确的数字。

6.2.5 Numerical operations标准文件 R5RS在讨论min和时在部分中有这样的说法max

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

现在可能有一个144比后者大得多的案例,0.9954079577517649但这将取决于后一个数字的不准确程度。如果不准确度在 10 亿% 左右,它可能会远大于144:-)

该标准的部分6.2.2 Exactness也有这个:

方案编号是准确的或不准确的。如果一个数字被写成一个精确的常数,或者只使用精确的运算从精确的数字推导出来,那么它就是精确的。

如果一个数字被写成一个不精确的常数,如果它是使用不精确的成分导出的,或者它是使用不精确的操作导出的,那么它就是不精确的。

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

-ish0.99数是不精确的,因为正弦和许多其他三角函数本质上是不精确的运算。的结果max是不精确的,因为它有不精确的输入。

于 2014-08-01T07:28:15.797 回答