簡體   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