2012-03-10 11 views
-8

私は二次式を計算するプログラムを作成しようとしていますが、それは常に負の数を返し、その理由を見つけることができません。このHaskellプログラムで負の数値を取得するのはなぜですか?

equation::(Double,Double,Double)->Double 
equation(x,y,z)=(-y-sqrt(y^2+4*x*z))/(2*x) 

ここで私を助けてもらえますか?

+6

なぜあなたの機能はうんざりですか?ヤク! – alternative

+0

私たちの回答の1つがあなたの質問に答えた場合は、それを受け入れてください(投票矢印の横にあるチェックマークをクリックしてください)?そうすれば、あなたの問題が解決されたことがわかります。問題が解決していない場合は、回答を改善するために何をすべきかを説明するコメントを残すことができます。 –

答えて

1

定義にはsqrtの前にマイナス記号があるため、問題の2つの数字のうち小さい方が常に得られます。それはしばしば否定的であるが、必ずしもそうではないので:

Prelude> equation (2, -4, -2) 
1.0 

(私は学校で学んだ式のバージョンは4*x*z部の符号に関しては若干異なっているが、それは明らかに式が可能かどうかに依存します。フォームx*X^2 + y*X + z = 0またはx*X^2 + y*X = zであるので、私はちょうどそれが誤植ではないことを仮定します)

2

解決それは常に私に負の数を与えるものではありません:

Prelude> equation (-1) 4 1 
3.732050807568877 

ちょうど1と同じようにと一緒に得るPythonの:

>>> (-4 - math.sqrt(16 - 4))/-2 
3.7320508075688772 

あなたは二次方程式の根をしたい場合は、しかし、あなたはあなたではなく引き算より付加を有しy^2 - 4*x*zを、したいです。

6

2次方程式を正しく実装していません。あなたの方程式には平方根があり、平方根は正と負の数(2*2-2*-2の両方が4です)を返します。ですから、このような何かをしたい:

equation::(Double,Double,Double)->(Double,Double) 
equation(x,y,z)=(((-1 * y + (sqrt (y^2 - (4 * x * z))))/(2 * x)),((-1 * y - (sqrt (y^2 - (4 * x * z))))/(2 * x))) 

または

quad :: (RealFloat a) => a -> a -> a -> (a,a) 
quad x y z = 
     let a = ((-1 * y + (sqrt (y^2 - (4 * x * z))))/(2 * x)) 
      b = ((-1 * y - (sqrt (y^2 - (4 * x * z))))/(2 * x)) 
     in (a,b) 
これは、(この例では、[私見]を従うことをクリーンかつ容易である一方で、以前のバージョンでは、あなたがあなたの元のサンプルで使用される書式設定を保持します)

aは、正の値平方根に対して出力される数値であり、bは、の負の数値の平方根に対して出力される数値です。

関連する問題