2

GHCiで遊び始めたところです。リストジェネレーターは基本的に、与えられたセット内の方程式を解くことがわかります。

Prelude> [x | x <- [1..20], x^2 == 4]
[2]

(予想どおり、ルートは1つだけ検出されます)

さて、解が指定された範囲に含まれているのに、なぜℝの結果で方程式を解くことができないのですか?

[x | x <- [0.1,0.2..2.0], x*4 == 2]

実数集合内でそのような方程式をどのように解くことができますか?

編集:申し訳ありませんが、0.1もちろん、私は意味しました。

4

4 に答える 4

8

リスト内包表記は方程式を解くのではなく、特定のセットに属するアイテムのリストを生成するだけです。セットがそのようなものとしてx[1..20]x^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]
于 2011-02-13T12:10:18.620 に答える
5

他の人が述べているように、これは方程式を解くための効率的な方法ではありませんが、比率を使用して行うことができます。

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

于 2011-02-13T21:28:37.030 に答える
4

浮動小数点の問題は、次の方法で解決できます。

Prelude> [x | x <- [0.1, 0.2 .. 2.0], abs(2 - x*4) < 1e-9]
[0.5000000000000001]

浮動小数点数が問題を引き起こす理由については、以下を参照してください。浮動小数点数の比較

于 2011-02-13T13:09:53.793 に答える
3

まず、[0.01,0.2..2.0]浮動小数点演算が正確であったとしても、0.5は含まれません。私はあなたが最初の要素がであることを意味したと思います0.1

[0.1,0.2..2.0]浮動小数点演算が不正確であり、の5番目の要素が0.5ではないため、リストには0.5が含まれてい[0.1,0.2..2.0]ません0.5000000000000001

于 2011-02-13T12:08:54.957 に答える