Functional programming 为什么Scheme/Dr.Racket(初级学生语言)中的(max(sin(/5 3))(sqr 12))被评估为不准确?
我正在阅读如何设计程序,在练习2.1.1中,我将: 了解DrScheme是否具有对数字进行平方运算的操作;用于计算角度的正弦;用于确定两个数字的最大值。-秒。2.2,ex 2.1.1 我的代码是:Functional programming 为什么Scheme/Dr.Racket(初级学生语言)中的(max(sin(/5 3))(sqr 12))被评估为不准确?,functional-programming,scheme,lisp,racket,inexact-arithmetic,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.9954079577517649和144。答案不应该是14
(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
的任何一个输入(或其他相关操作)不准确,则方案将给出一个不准确的数字
标准文件R5RS在讨论min
和max
时,在第6.2.5节数值运算中有这样的表述:
注意:如果任何参数是不精确的,那么结果也将是不精确的(除非程序可以证明不精确性不足以影响结果,这只有在不寻常的实现中才可能发生)
现在可能有这样一种情况,144
远大于0.9954079577517649
,但这取决于后者的不准确程度。如果误差在10亿%左右,很可能远远大于144
:-)
该标准的第6.2.2节“精确性”也包括:
方案编号要么精确,要么不精确。如果一个数字是作为一个精确常数写的,或者是仅使用精确运算从精确数字推导出来的,那么它就是精确的
如果一个数字被写成一个不精确常数,如果它是使用不精确成分导出的,或者如果它是使用不精确运算导出的,那么它就是不精确的
因此,不精确性是数字的一种传染性
0.99
-ish数是不精确的,因为正弦函数和许多其他三角函数本质上是不精确的运算。max
的结果是不精确的,因为它有不精确的输入。“现在可能有一种情况,144远远大于0.9954079577517649,但这取决于后一个数字的不精确程度:-)”。我通过测试4种不同的语句确认了粗体的语句,它们是:(max(sqr 10)(sqr 25))
=625
<代码>(最大值(sqr 10)(sqr 3.5))
=100
,改变答案的不是浮点数(max(sqr 10)(sqr#i3.5))
=#i100.0
,是有理数改变了答案(max(sqr 10)(sqr#i3))
=#i100.i
,我刚刚确认它是否有效,即使整数不精确。谢谢你的帮助。你的第二句话描述了计划的正确性,这对我帮助更大。再次感谢。