簡體   English   中英

Java Float Precision,值介於0和1之間

[英]Java Float Precision for values between 0 and 1

我將0到1之間的值存儲為浮點數。 我知道可辨別的浮點數之間的差值越小,浮點數越接近0.因此,我認為在我的情況下精度非常高(因為最高浮點數為1 ..)。 在比較其中兩個花車時,我需要考慮多大的ε? 即1.0f與小於1.0f的最大可表示浮點之間的差距有多大? 我很抱歉,如果這個問題看起來太廣泛/一般但我找不到答案:-(謝謝

您可以使用函數java.lang.Math.nextAfter(float start, double direction)來幫助您。

在您的情況下,使用nextAfter(1.0f, 0.0)來調用它。 在這里,我們將direction設置為小於您的起始編號,因此它將“向后”搜索。 得到的float是你的答案。

因為此函數還有一個重載需要一個double start ,所以要小心使用1.0f來表示float文字。

要獲得float或double值的分辨率單位,可以使用Math.ulp(x) ,它將為您提供x與下一個可表示值之間的差異。 注意: 1 1.0之前的值有兩倍的差距

float f = 1.0f, f_1 = Math.nextDown(f);
double d = 1.0, d_1 = Math.nextDown(d);

int f_1i = Float.floatToRawIntBits(f_1);
System.out.println("f_1=" + f_1 + " f_1i=" + Integer.toHexString(f_1i) + " eps=" + Math.ulp(f_1) + " nextUp=" + Math.nextUp(f_1));

int fi = Float.floatToRawIntBits(f);
System.out.println("f=" + f + " fi=" + Integer.toHexString(fi) + " eps=" + Math.ulp(f) + " nextUp=" + Math.nextUp(f));

long d_1i = Double.doubleToRawLongBits(d_1);
System.out.println("d_1=" + d_1 + " d_1i=" + Long.toHexString(d_1i) + " eps=" + Math.ulp(d_1) + " nextUp=" + Math.nextUp(d_1));

long di = Double.doubleToRawLongBits(d);
System.out.println("d=" + d + " di=" + Long.toHexString(di) + " eps=" + Math.ulp(d) + " nextUp=" + Math.nextUp(d));

版畫

f_1=0.99999994 f_1i=3f7fffff eps=5.9604645E-8 nextUp=1.0
f=1.0 fi=3f800000 eps=1.1920929E-7 nextUp=1.0000001
d_1=0.9999999999999999 d_1i=3fefffffffffffff eps=1.1102230246251565E-16 nextUp=1.0
d=1.0 di=3ff0000000000000 eps=2.220446049250313E-16 nextUp=1.0000000000000002

您還可以通過查看原始整數表示來對可表示的值進行算術運算。

例如Math.nextUp

public static double nextUp(double d) {
    if( Double.isNaN(d) || d == Double.POSITIVE_INFINITY)
        return d;
    else {
        d += 0.0d;
        return Double.longBitsToDouble(Double.doubleToRawLongBits(d) +
                                       ((d >= 0.0d)?+1L:-1L));
    }
}

BTW d += 0.0d-0.0變為+0.0

System.out.println(Math.ulp(Double.NEGATIVE_INFINITY));

版畫

Infinity

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM