9

何かが壊れているか、何が起こっているのか理解できませんか?

static String getRealBinary(double val) {
    long tmp = Double.doubleToLongBits(val);
    StringBuilder sb = new StringBuilder();

    for (long n = 64; --n > 0; tmp >>= 1)
        if ((tmp & 1) == 0)
            sb.insert(0, ('0'));
        else
            sb.insert(0, ('1'));

    sb.insert(0, '[').insert(2, "] [").insert(16, "] [").append(']');
    return sb.toString();
}

public static void main(String[] argv) {
    for (int j = 3; --j >= 0;) {
        double d = j;
        for (int i = 3; --i >= 0;) {
            d += Double.MIN_VALUE;
            System.out.println(d +getRealBinary(d));
        }
    }
}

出力あり:

2.0[1] [00000000000] [000000000000000000000000000000000000000000000000000]
2.0[1] [00000000000] [000000000000000000000000000000000000000000000000000]
2.0[1] [00000000000] [000000000000000000000000000000000000000000000000000]
1.0[0] [11111111110] [000000000000000000000000000000000000000000000000000]
1.0[0] [11111111110] [000000000000000000000000000000000000000000000000000]
1.0[0] [11111111110] [000000000000000000000000000000000000000000000000000]
4.9E-324[0] [00000000000] [000000000000000000000000000000000000000000000000001]
1.0E-323[0] [00000000000] [000000000000000000000000000000000000000000000000010]
1.5E-323[0] [00000000000] [000000000000000000000000000000000000000000000000011]
4

5 に答える 5

9

一般的な考え方は、最初にdoubleをlong表現に変換し(doubleToLongBitsで行ったようにgetRealBinary)、そのlongを1ずつインクリメントし、最後に新しいlongを。を介して表現するdoubleに変換し直しlongBitsToDoubleます。

編集:Java(1.5以降)はを提供しますMath.ulp(double)。これを使用して、次に高い値を直接計算できると思いますx + Math.ulp(x)

于 2010-10-10T13:24:14.753 に答える
7

浮動小数点数は、整数型のように数直線上に均一に分散されません。それらは、0の近くでより密集しており、無限に近づくにつれて非常に離れています。したがって、次の浮動小数点数に到達するために浮動小数点数に追加できる定数はありません。

于 2010-10-10T13:21:56.367 に答える
4

あなたのコードは整形式ではありません。最小のdouble値を追加しようとし、結果が元の値と異なることを期待します。問題は、double.MinValueが非常に小さいため、結果が丸められ、影響を受けないことです。

推奨読書: http: //en.wikipedia.org/wiki/Machine_epsilon

ウィキペディアの記事には、Javaコードもあります。イプシロンは、定義上、(X + eps * X!= X)などの最小数であり、eps*Xは「相対イプシロン」と呼ばれます。

于 2010-10-10T13:26:50.920 に答える
4

Java 1.8以降java.lang.Math.nextUp(double)、まさにあなたが望むことをしている。反対もありjava.lang.Math.nextDown(double)ます。

于 2017-05-17T13:30:25.847 に答える
0

BigDecimalクラスを使用する場合は、BigDecimal.ulp()メソッドもあります。

于 2013-09-18T10:06:37.990 に答える