Java浮动到双 - 上限和下限?

时间:2011-11-24 21:45:00

标签: java floating-point double precision ieee-754

正如大多数人都知道的那样,双重 - >漂浮导致精度损失。这意味着,可以将多个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);
}

1 个答案:

答案 0 :(得分:3)

您的testIntervalHack不起作用,映射到同一double的{​​{1}}值范围会有所不同。例如,对于floatx = 2^24-1double之间的每个x-0.5都会映射到相同的值x+0.5 float的值{} ,但是x

我不知道任何方便的API方法,所以我能提供的最好的是

  1. 转换为x +/- Float.MIN_VALUE == x
  2. 通过double
  3. double转换为位代表
  4. 加上或减去2 28 或2 28 -1中的一个,取决于您是想要上限还是下限2 29 -bit为0或1(因为舍入到偶数)
  5. 通过doubleTo(Raw)LongBits
  6. 将该长片转换为双倍

    嗯,这是longBitsToDouble范围内的有限值。对于float s,您可以在步骤1之后停止。对于无穷大,它更加精细,因为NaN值大于或等于2 128 -2 103 转换为double,与(float)Infinity的位代表相距很远。