gpt4 book ai didi

java - 将 double 与零进行比较

转载 作者:太空狗 更新时间:2023-10-29 22:32:08 24 4
gpt4 key购买 nike

我是 Java 的新手,我一直在尝试实现一种算法来求三次方程的根。当我计算判别式并尝试检查它相对于零下降的位置时,问题就出现了。

如果运行它并输入数字“1 -5 8 -4”,输出如下:

1 -5 8 -4
p=-0.333333, q=0.074074
disc1=0.001372, disc2=-0.001372
discriminant=0.00000000000000001236
Discriminant is greater than zero.

我知道问题的出现是因为 double 的计算不精确。通常判别式应为 0,但最终会变成类似 0.00000000000000001236 的值。

我的问题是,避免这种情况的最佳方法是什么?我应该检查数字是否落在零的 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.");
}
}
}

最佳答案

最简单的 epsilon 检查是

if(Math.abs(value) < ERROR)

比较复杂的是和值成正比的

if(Math.abs(value) < ERROR_FACTOR * Math.max(Math.abs(a), Math.abs(b)))

在您的特定情况下,您可以:

if (discriminant > ERROR) {
System.out.println("Discriminant is greater than zero.");
} else if (discriminant < -ERROR) {
System.out.println("Discriminant is less than zero.");
} else {
System.out.println("Discriminant is equal to zero.");
}

关于java - 将 double 与零进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8194917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com