我正在阅读如何设计程序,在练习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.9954079577517649
和144
。答案不应该是144
或144.0
而不是#i144.0
? 最佳答案
如果max
的任何输入(或其他操作)不精确,Scheme将给您一个不精确的数字。
在讨论6.2.5 Numerical operations
和min
时,标准文档R5RS在max
一节中有这样的表述:
注意:如果任何参数是不精确的,那么结果也将是不精确的(除非过程能够证明不精确性不足以影响结果,这只有在不寻常的实现中才可能)。
现在可能有一个例子可以证明144
比0.9954079577517649
大得多,但这取决于后一个数字的不精确程度如果误差在十亿分之一左右,它很可能远大于144
:-)
该标准的6.2.2 Exactness
部分还包括:
方案编号要么是精确的,要么是不精确的如果一个数字是作为一个精确的常量写的,或者是从精确的数字派生出来的,那么它就是精确的。
如果一个数字被写成不精确的常数,如果它是用不精确的成分推导出来的,或者是用不精确的运算推导出来的,那么它就是不精确的。
因此,不精确性是一个数的传染性质。
ish数是不精确的,因为正弦和许多其他三角函数本质上是不精确的运算0.99
的结果是不精确的,因为它有不精确的输入。
关于functional-programming - 为什么在Scheme/Dr。(max(sin(/5 3))(sqr 12))中 Racket (学生语言开始)评估为不准确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25074897/