我刚开始玩 GHCi。我看到列表生成器基本上解决了给定集合内的方程:
Prelude> [x | x <- [1..20], x^2 == 4]
[2]
(如预期的那样只找到一个根)
现在,既然解包含在指定范围内,为什么我不能求解结果为 ℝ 的方程?
[x | x <- [0.1,0.2..2.0], x*4 == 2]
如何在实数集中求解此类方程?
编辑:对不起,我的意思是0.1
,当然。
我刚开始玩 GHCi。我看到列表生成器基本上解决了给定集合内的方程:
Prelude> [x | x <- [1..20], x^2 == 4]
[2]
(如预期的那样只找到一个根)
现在,既然解包含在指定范围内,为什么我不能求解结果为 ℝ 的方程?
[x | x <- [0.1,0.2..2.0], x*4 == 2]
如何在实数集中求解此类方程?
编辑:对不起,我的意思是0.1
,当然。
列表推导不解决方程式,它只是生成属于某些集合的项目列表。如果您的 set 被定义为any x
in [1..20]
such thatx^2==4
,那就是您得到的。
你不能用从0.01
到的任何实数的完整列表来做到这一点2.0
,因为这样的实数列表不能用 haskell 表示(或者更好:它不能在任何计算机上表示),因为它具有无限精度的无限数。
[0.01,0.2..2.0]
是由以下数字组成的列表:
Prelude> [0.01,0.2..2.0]
[1.0e-2,0.2,0.39,0.5800000000000001,0.7700000000000001,0.9600000000000002,1.1500000000000004,1.3400000000000005,1.5300000000000007,1.7200000000000009,1.910000000000001]
这些数字都不能满足您的要求。
请注意,您可能指的是[0.1,0.2..2.0]
而不是[0.01,0.2..2.0]
. 仍然:
Prelude> [0.1,0.2..2.0]
[0.1,0.2,0.30000000000000004,0.4000000000000001,0.5000000000000001,0.6000000000000001,0.7000000000000001,0.8,0.9,1.0,1.1,1.2000000000000002,1.3000000000000003,1.4000000000000004,1.5000000000000004,1.6000000000000005,1.7000000000000006,1.8000000000000007,1.9000000000000008,2.000000000000001]
正如其他人所提到的,这不是求解方程的有效方法,但可以通过比率来完成。
Prelude> :m +Data.Ratio
Prelude Data.Ratio> [x|x<-[1%10, 2%10..2], x*4 == 2]
[1 % 2]
读x % y
作x divided by y
.
浮点问题可以这样解决:
Prelude> [x | x <- [0.1, 0.2 .. 2.0], abs(2 - x*4) < 1e-9]
[0.5000000000000001]
有关为什么浮点数会产生问题的参考,请参见:Comparing floating point numbers
首先,[0.01,0.2..2.0]
即使浮点运算是准确的,也不包括 0.5。我假设您的意思是第一个元素是0.1
.
该列表[0.1,0.2..2.0]
不包含 0.5,因为浮点运算不精确,并且第 5 个元素[0.1,0.2..2.0]
是0.5000000000000001
,而不是 0.5。