循环和双精度浮点数出现异常

4

我第一次尝试数值求解微分方程。我的程序会要求输入一些参数,然后计算达到给定温度所需的冷却时间。以下是我的主函数:

import java.util.Scanner;

public class Step2_lab11 {
    public static int TAO = 50;
    public static double DELTA_MINUTES = 0.1;

    public static void main(String[] args) {

        System.out.println("VINETS AVKYLNINGSTID \n");
        System.out.println("Ange vinets temperatur:");

        Scanner userIn = new Scanner(System.in);
        double wineTemp = userIn.nextDouble();

        System.out.println("Vinets önskade temperatur:");
        double preferredTemp = userIn.nextDouble();

        System.out.println("Kylens/frysens temperatur:");
        double chillTemp = userIn.nextDouble();

        WineChiller wineChiller = new WineChiller();

        double elapsedTime = 0.0;

        while(wineTemp > preferredTemp) {

            elapsedTime = elapsedTime + DELTA_MINUTES;
            double dT = wineChiller.getChillingTime(TAO, DELTA_MINUTES, chillTemp, preferredTemp, wineTemp);
            wineTemp = wineTemp - dT;
            System.out.println(elapsedTime);


        }
    }

}

以下是WineChiller.java文件的内容:

public class WineChiller {
    public WineChiller() {


    }

    public double getChillingTime(int TAO, double DELTA_MINUTES, double chillTemp, double preferredTemp, double wineTemp) {

        double dT = (wineTemp - chillTemp) * DELTA_MINUTES  / TAO;
        return dT;
    }

}

在这个while循环中,Syso部分会输出以下内容(其中wineTemp = 25,preferredTemp = 16,chillTemp = 5)。
0.1
0.2
0.30000000000000004
....
29.300000000000146
29.400000000000148
29.50000000000015
29.60000000000015
29.700000000000152
29.800000000000153
29.900000000000155

不知道为什么会添加随机小数。我也认为(但我不确定)正确答案应该恰好是30分钟,而不是29.9。我是否错过了一些明显的逻辑错误?

1个回答

10

您需要阅读这篇文章

这就是二进制数字和IEEE浮点表示法的工作方式。

在二进制中,你无法精确地表示0.1,就像在十进制中你无法表示1/3一样。

这就是为什么使用double或float时不应该比较值;你需要一个对于差异绝对值的公差。

看起来像是针对集总质量的瞬态换热的一阶ODE的简单欧拉积分。确保你了解时间步长选择如何影响稳定性和精度。


这里也许需要提到 BigDecimal 吗? - Thorn G
我不会在进行严肃的数值工作时使用它。我所做的科学计算并不依赖它。 - duffymo
1
@TomG BigDecimal适用于特别重要的短而精确的小数分数,如货币计算。欧拉积分没有什么使小数特殊的地方。最好保留double并允许在比较中进行舍入误差。 - Patricia Shanahan
很棒的个人简介,Patricia。听起来你做了一些非常出色的工作。 - duffymo
@PatriciaShanahan 哦,我明白了。从期望答案为30的评论中,我认为这里重要的是无限精度。好的,知道了! - Thorn G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接