Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/scheme/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 为什么Scheme/Dr.Racket(初级学生语言)中的(max(sin(/5 3))(sqr 12))被评估为不准确?_Functional Programming_Scheme_Lisp_Racket_Inexact Arithmetic - Fatal编程技术网

Functional programming 为什么Scheme/Dr.Racket(初级学生语言)中的(max(sin(/5 3))(sqr 12))被评估为不准确?

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

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

如果
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
,我刚刚确认它是否有效,即使整数不精确。谢谢你的帮助。你的第二句话描述了计划的正确性,这对我帮助更大。再次感谢。