为什么我在Haskell程序中得到负数?
问题描述:
我想创建一个计算二次公式的程序,但事实证明,它总是给我一个负数,我找不到原因?为什么我在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