【发布时间】:2017-05-17 21:30:25
【问题描述】:
是有什么东西坏了还是我不明白发生了什么?
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]
【问题讨论】:
-
你想做什么?你有什么问题?
-
我的问题是:“如何通过最小增量改变 double”,这是我失败的努力。
-
如果你想做最小的增量,为什么不直接编辑这些位呢,因为 MIN_VALUE 很小(真的很小)所以 0+真的很小 = 真的很小,但是 2+ 真的会失败小〜= 2它是因为浮动点,min_value尽可能远离点,而对于两个它在中间的某个地方,左边输了。你可以在点后看到它大约 300 位的差异应该是,而 double 只存储大约 15-20 位有效数字。
-
自我说明:'--n > 0;'应该是'--n >= 0;'。