小编chr*_*zie的帖子

比较Java中的相等的双重值.

我想从那些double在Java中使用原始相等经验的人那里得到一些建议.使用d1 == d2两个双打d1并且d2由于可能的舍入误差而不够.

我的问题是:

  1. Java是否Double.compare(d1,d2) == 0在某种程度上处理舍入错误?如1.7文档中所述,0如果d1在数值上等于,则返回值d2.是否有人确定它们在数值上是什么意思?

  2. 对某些delta值使用相对误差计算,是否会推荐使用delta的通用(非特定于应用程序)值?请参阅下面的示例.

下面是考虑相对误差来检查相等性的通用函数.delta您建议从简单的操作+, - ,/,*操作中捕获大多数舍入错误的价值是多少?

public static boolean isEqual(double d1, double d2) {
    return d1 == d2 || isRelativelyEqual(d1,d2);
}

private static boolean isRelativelyEqual(double d1, double d2) {
    return delta > Math.abs(d1- d2) / Math.max(Math.abs(d1), Math.abs(d2));
}
Run Code Online (Sandbox Code Playgroud)

java double double-precision

9
推荐指数
1
解决办法
3万
查看次数

确保在主应用程序崩溃时停止无限循环的线程

我创建了一个Runnable类,负责监视目录中的文件更改.

... imports ...

public class ExamplePathWatch implments Runnable {
    ...
    private boolean isRunning = true;
    ...

    @Override
    public void run() {
        while(isRunning) {
            [1]... wait for a file change ...
            [2]... notify listeners of file change (if any) ...
        }
    }

    public synchronized void stopPathWatch() {
        isRunning = false;
        ... interrupt [1] and allow the thred to exit immediately...
    }
Run Code Online (Sandbox Code Playgroud)

线程在[1]处暂停,直到发生文件更改,或者stopPathWatch()调用方法来设置isRunning = false和中断在[1]处的当前等待.

在主应用程序退出之前,stopPathWatch()调用它允许线程退出并且整个应用程序完全终止.

我的问题是,当应用程序崩溃时,主应用程序终止,而不会stopPathWatch()被调用.因此,应用程序会在后台无限期地运行,直到它通过操作系统被杀死.

由于应用程序上有非常活跃的开发并且并未处理所有异常,因此无论主应用程序如何终止,是否有建议的方法来确保子线程被停止?

谢谢

java multithreading

2
推荐指数
1
解决办法
410
查看次数

标签 统计

java ×2

double ×1

double-precision ×1

multithreading ×1