我是新來的Java,我一直在試圖實現一個算法,以找到立方程的根源。當我計算判別式並嘗試檢查它相對於零下降的位置時,會出現問題。比較一個零對
如果你運行它,並輸入數字「1 - 5月8 -4」時,輸出如下:
1 -5 8 -4
p=-0.333333, q=0.074074
disc1=0.001372, disc2=-0.001372
discriminant=0.000000000000000
Discriminant is greater than zero.
我知道這個問題的產生是因爲與雙打的計算是不準確的。通常情況下,判別式應該是0,但最終結果是類似於0.000000000000000。
我的問題是,避免這種情況的最好方法是什麼?我應該檢查一下數字是否在零附近的epsilon鄰域之間?還是有更好更精確的方法?
非常感謝您的回答。
import java.util.Scanner;
class Cubical {
public static void main(String[] args) {
// Declare the variables.
double a, b, c, d, p, q, gamma, discriminant;
Scanner userInput = new Scanner(System.in);
a = userInput.nextDouble();
b = userInput.nextDouble();
c = userInput.nextDouble();
d = userInput.nextDouble();
// Calculate p and q.
p = (3*a*c - b*b)/(3*a*a);
q = (2*b*b*b)/(27*a*a*a) - (b*c)/(3*a*a) + d/a;
// Calculate the discriminant.
discriminant = (q/2)*(q/2) + (p/3)*(p/3)*(p/3);
// Just to see the values.
System.out.printf("p=%f, q=%f\ndisc1=%f, disc2=%f\ndiscriminant=%.20f\n", p, q, (q/2)*(q/2), (p/3)*(p/3)*(p/3), (q/2)*(q/2) + (p/3)*(p/3)*(p/3));
if (discriminant > 0) {
System.out.println("Discriminant is greater than zero.");
}
if (discriminant == 0) {
System.out.println("Discriminant is equal to zero.");
}
if (discriminant < 0) {
System.out.println("Discriminant is less than zero.");
}
}
}
@hattenn:對於OP,彼得的第二個建議是要走的路。 –
哪個值更適合ERROR? –
@LunaKong錯誤取決於上下文。它可能是1e-12到1e-3,或者它可能需要別的東西。 –