我正在阅读如何设计程序,在练习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.9954079577517649
和144
的最大值。答案不应该是144
或144.0
而不是#i144.0
吗?
答案 0 :(得分:2)
max
(或其他操作)的任何一个输入都不准确,Scheme会给你一个不精确的数字。
标准文档R5RS在讨论6.2.5 Numerical operations
和min
时在max
部分中说明了这一点:
注意:如果任何参数不精确,那么结果也将是不精确的(除非该过程可以证明不准确性不足以影响结果,这只有在异常实现中才有可能)。
现在可能会出现144
远大于0.9954079577517649
的情况,但这取决于级别后一个数字的不准确性。如果不准确度大约为10亿,那么它可能远远大于144
: - )
该标准的6.2.2 Exactness
部分也有:
方案编号是精确的还是不精确的。如果数字被写为精确常数或仅使用精确操作从精确数字导出,则数字是精确的。
如果一个数字被写为不精确的常量,如果使用不精确的成分派生,或者如果它是使用不精确的操作派生的话,则该数字是不精确的。
因此,不精确是一个数字的传染性财产。
0.99
- ish数字是不精确的,因为正弦和许多其他三角函数本质上是不精确的操作。 max
的结果是不精确的,因为它有不精确的输入。