我想創建一個計算二次公式的程序,但事實證明,它總是給我一個負數,我找不到原因?爲什麼我在Haskell程序中得到負數?
equation::(Double,Double,Double)->Double
equation(x,y,z)=(-y-sqrt(y^2+4*x*z))/(2*x)
有人可以幫我在這裏嗎?
我想創建一個計算二次公式的程序,但事實證明,它總是給我一個負數,我找不到原因?爲什麼我在Haskell程序中得到負數?
equation::(Double,Double,Double)->Double
equation(x,y,z)=(-y-sqrt(y^2+4*x*z))/(2*x)
有人可以幫我在這裏嗎?
由於您的定義在sqrt
的前面有一個負號,因此它總是會產生所討論的兩個數中較小的一個。這往往是負面的,但不一定是這樣:
Prelude> equation (2, -4, -2)
1.0
(我在學校學到的公式的版本是相對於4*x*z
部分的符號稍有不同,但是這顯然取決於公式是否是解決的形式是x*X^2 + y*X + z = 0
或x*X^2 + y*X = z
的,所以我就認爲它不是一個錯字)
它並不總是給我一個負數。
Prelude> equation (-1) 4 1
3.732050807568877
就像一個會得到例如的Python:
>>> (-4 - math.sqrt(16 - 4))/-2
3.7320508075688772
如果你想二次方程的根,但是,你要y^2 - 4*x*z
,在這裏你有除,而不是減法。
您正在錯誤地實現二次方程。方程中有一個平方根,平方根給出正數和負數(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
是輸出的數字爲負數平方根。
爲什麼你的功能不安全?呸! – alternative 2012-03-10 23:46:29
嘿,如果我們的答案之一回答了您的問題,請您接受它(點擊投票箭頭旁邊的複選標記)?那樣我們知道你的問題解決了。如果你的問題沒有解決,你能否留下評論來解釋需要做什麼,以便我們改進我們的答案。 – 2012-04-15 15:55:53