EQ Solver String返回中的复杂值问题

时间:2013-06-26 23:16:20

标签: java android equation

我有这种方法来解决二次方程式,它根据三角形返回两种类型的数组(如果小于零而不是复杂的解)

public static final String[] quadEquationSolver(double a, double b, double c) {
        double delta = (b * b) - 4 * a * c;
        double q;
        if (delta < 0) {
            double deltar = Math.abs(Math.sqrt(delta));
            q = ((b < 0) ? -0.5 * (b - deltar) : -0.5 * (b + deltar));
            double t0 = q / a;
            double t1 = c / q;
            // return sorted array
            return (t0 > t1) ? new String[] { t1 + "i", t0 + "i" }
                    : new String[] { t0 + "i", t1 + "i" };
        } else {
            double deltar = Math.sqrt(delta);
            q = ((b < 0) ? -0.5 * (b - deltar) : -0.5 * (b + deltar));
            double t0 = q / a;
            double t1 = c / q;
            // return sorted array
            return (t0 > t1) ? new String[] { t1 + "", t0 + "" }
                    : new String[] { t0 + "", t1 + "" };
        }

    }

不幸的是,当delta<0得到一个只包含NaNi值的String数组时,尽管结果正确,但我无法理解为什么

1 个答案:

答案 0 :(得分:1)

问题在于:

if (delta < 0) {
            double deltar = Math.abs(Math.sqrt(delta));

delta < 0时,Math.sqrt(delta)将返回NaNMath.abs(NaN)也会根据API返回NaN。任何涉及NaN值的后续公式都会产生NaN结果,因此您会看到您所看到的结果。

您应该尝试更换Math.sqrtMath.abs方法调用,以避免出现此问题:

if (delta < 0) {
            double deltar = Math.sqrt(Math.abs(delta));

Java Math库不支持复数处理。如果您想明确使用复数,可以尝试查看Apache Commons Math Library