我有这种方法来解决二次方程式,它根据三角形返回两种类型的数组(如果小于零而不是复杂的解)
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数组时,尽管结果正确,但我无法理解为什么
答案 0 :(得分:1)
问题在于:
if (delta < 0) {
double deltar = Math.abs(Math.sqrt(delta));
当delta < 0
时,Math.sqrt(delta)
将返回NaN
而Math.abs(NaN)
也会根据API返回NaN。任何涉及NaN值的后续公式都会产生NaN结果,因此您会看到您所看到的结果。
您应该尝试更换Math.sqrt
和Math.abs
方法调用,以避免出现此问题:
if (delta < 0) {
double deltar = Math.sqrt(Math.abs(delta));
Java Math库不支持复数处理。如果您想明确使用复数,可以尝试查看Apache Commons Math Library