1

我有这种方法来求解二次方程,它根据增量返回 2 种类型的数组(如果小于零,则有复杂的解)

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值的字符串数组时,但我不知道为什么

4

1 回答 1

1

问题在这里:

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

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

您应该尝试交换Math.sqrtandMath.abs方法调用,以避免这样的问题:

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

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

于 2013-06-27T00:47:15.127 回答