[英]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
不起作用,映射到同一個float
的double
值范圍會有所不同。 例如,當x = 2^24-1
, x-0.5
和x+0.5
之間的每個double
float
都將映射到相同的值( x
的float
值),但x +/- Float.MIN_VALUE == x
。
我不知道任何方便的API方法,所以我能提供的最好的方法是
double
doubleTo(Raw)LongBits
將double
轉換為位表示 longBitsToDouble
將long轉換為double 嗯,這是float
范圍內的有限值。 對於NaN
s,您可以在步驟1之后停止。對於無窮大,它更精細一些,因為大於或等於2 128 -2 103的 double
值被轉換為(float)Infinity
,這與相當遠離(double)Infinity
位表示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.