繁体   English   中英

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

[英]Java float to double - upper and lower bounds?

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

testIntervalHack不起作用,映射到同一个floatdouble值范围会有所不同。 例如,当x = 2^24-1x-0.5x+0.5之间的每个double float都将映射到相同的值( xfloat值),但x +/- Float.MIN_VALUE == x

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

  1. 转换为double
  2. 通过doubleTo(Raw)LongBitsdouble转换为位表示
  3. 根据您是想要上限还是下限,2 29位是0还是1(因为舍入到偶数),加2或减2 28或2 28 -1中的一个
  4. 通过longBitsToDouble将long转换为double

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM