当前位置: 首页 > 面试题库 >

比较双数与零

赵浩邈
2023-03-14
问题内容

我是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.

我知道问题是因为双精度计算不精确。通常,判别式应为0,但最终变为0.00000000000000001236。

我的问题是,避免这种情况的最佳方法是什么?我是否应该检查数字是否介于零附近的ε之间?还是有更好,更精确的方法?

预先感谢您的回答。

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库?例如 我开始的每个项目最终都要重新实现,然后粘贴代码并进行测试。 注意,为什么最好使用第三方JAR是IBM的建议一个很好的例子: “如果您不知道基础测量的规模,那么使用测试“ abs(a / b-1)<epsilon”可能比简单比较差异更可靠。” 我怀疑很多人会想到这一点,并说明即使是简单的代码也可能不是最优的。 问题答案: 番石榴有。

  • 问题内容: 我写了以下代码: 如果我说有两个双数,则差应为。但是,当我将数字转换为int时,其差异最终为,这是不正确的。 因此,我需要返回一个double而不是一个int。问题是,我的领域是双重的。我怎么解决这个问题? 问题答案: 您不需要返回。 该接口用于为要比较的元素建立排序。具有使用的字段与该顺序无关。 您的代码很好。 抱歉,我错了,再次阅读问题,这是您需要的:

  • 今天,我正在浏览一些C代码(由其他人编写),并找到了这一部分: 我试图弄清楚这是否有意义。 < code>epsilon()的文档说明: 该函数返回1与大于1的最小值之间的差值,该最小值可[由双精度]表示。 这也适用于 0 吗,即 是大于 0 的最小值?还是有 到 之间的数字可以用表示? 如果不是,那么比较不就等于< code>someValue == 0.0吗?

  • 为什么下面的返回为假?

  • 我有两个基于同一ecore模型的EMF实例版本。我需要以以下格式准备一个从v1到v2更改的事物列表