正如大多数人都知道的那样,双重 - >漂浮导致精度损失。这意味着,可以将多个double值映射到相同的float值。 但是我该如何走另一条路呢?给定一个正常的(我不关心极端情况)浮点数,如何找到仍然映射到同一浮点数的双精度的上限和下限值?
或者,用代码说话:
function boolean testInterval(float lowF, float highF, double queryD) {
float queryF = (float) queryD;
return (lowF <= queryF) && (queryF <= highF);
}
和
function boolean testInterval(float lowF, float highF, double queryD) {
double lowD = (double) lowF;
double highD = (double) highF;
return (lowD <= queryD) && (queryD <= highD);
}
并不总是给出相同的结果。我正在寻找两个函数float-&gt; double使第二个函数在第一个函数返回相同的结果。
这可能有用,但它看起来像是黑客而不适合我。
function boolean testIntervalHack(float lowF, float highF, double queryD) {
double lowD = (double) lowF - Float.MIN_VALUE;
double highD = (double) highF + Float.MIN_VALUE;
return (lowD <= queryD) && (queryD <= highD);
}
答案 0 :(得分:3)
您的testIntervalHack
不起作用,映射到同一double
的{{1}}值范围会有所不同。例如,对于float
,x = 2^24-1
和double
之间的每个x-0.5
都会映射到相同的值x+0.5
float
的值{} ,但是x
。
我不知道任何方便的API方法,所以我能提供的最好的是
x +/- Float.MIN_VALUE == x
double
double
转换为位代表
doubleTo(Raw)LongBits
嗯,这是longBitsToDouble
范围内的有限值。对于float
s,您可以在步骤1之后停止。对于无穷大,它更加精细,因为NaN
值大于或等于2 128 -2 103 转换为double
,与(float)Infinity
的位代表相距很远。