相关疑难解决方法(0)

这两种方法是否与Java中最小的Double值相当?

替代措辞:何时将Double.MIN_VALUE添加到Java中的double 不会导致不同的Double值?(见Jon Skeet的评论如下)

关于Java中最小Double值的这个问题有一些答案在我看来是等价的. Jon Skeet的回答无疑是有效的,但他的解释并没有让我相信它与理查德的 答案有什么不同.

Jon的回答使用以下内容:

double d = // your existing value;
long bits = Double.doubleToLongBits(d);
bits++;
d = Double.longBitsToDouble();
Run Code Online (Sandbox Code Playgroud)

理查兹回答提到了JavaDoc Double.MIN_VALUE

保持double类型的最小正非零值的常量,2-1074.它等于十六进制浮点字面值0x0.0000000000001P-1022并且也等于Double.longBitsToDouble(0x1L).

我的问题是,Double.logBitsToDouble(0x1L)与Jon的不同之处bits++;有何不同?

Jon的评论侧重于基本的浮点问题.

将Double.MIN_VALUE添加到double值和增加表示double的位模式之间存在差异.由于存储浮点数的方式,它们是完全不同的操作.如果您尝试将一个非常小的数字添加到一个非常大的数字,差异可能很小,以至于最接近的结果与原始数字相同.但是,在当前位模式中添加1将始终将相应的浮点值更改为在该比例下可见的最小可能值.

我没有看到Jon添加Double.MIN_VALUE增加长"bit ++"的方法有什么不同.他们何时会产生不同的结果?

我编写了以下代码来测试差异.也许有人可以提供更多/更好的样本双数或使用循环来找到存在差异的数字.

    double d = 3.14159269123456789; // sample double
    long bits = Double.doubleToLongBits(d);
    long bitsBefore = bits;
    bits++;
    long bitsAfter = bits;
    long bitsDiff = bitsAfter - bitsBefore;
    long bitsMinValue = Double.doubleToLongBits(Double.MIN_VALUE);
    long bitsSmallValue = …
Run Code Online (Sandbox Code Playgroud)

java floating-point

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

标签 统计

floating-point ×1

java ×1