doubleとfloatの精度と値の範囲

(1)値の範囲

floatとdoubleの範囲は、指数の桁数によって決まります。

floatの指数ビットは8ビットで、doubleの指数ビットは11ビットであり、次のように分散されます。

浮く:

 

1ビット(符号ビット)

8ビット(指数ビット)

23ビット(仮数ビット)

ダブル:

 

1ビット(符号ビット)

11ビット(指数ビット)

52ビット(仮数ビット)

したがって、floatの指数範囲は-127〜 + 128であり、doubleの指数範囲は-1023〜 + 1024であり、指数ビットは補数の形式で分割されます。負の指数は、浮動小数点数で何ができるかを決定します

最小の絶対値が表現されたゼロ以外の数値。正の指数は、浮動小数点数が表現できる最大の絶対値を持つ数値を決定します。これにより、浮動小数点数の値の範囲も決定されます。フロートの範囲は-2 ^ 128〜 + 2 ^ 128、

つまり、-3.40E + 38〜 + 3.40E + 38、doubleの範囲は-2 ^ 1024〜 + 2 ^ 1024、つまり-1.79E + 308〜 + 1.79E +308です。

(2)精度

floatとdoubleの精度は、小数部だけでなく、全体の桁数に基づいています。

floatの精度は有効数字7〜8桁で、7桁が保証され、8桁の値も存在します。

倍精度は16〜17有効数字です

コードの一部を見てください

public class Main {

    public static void main(String[] args) {
        float f6 = 1.000003f;//6位小数位,总共7位
        float f7 = 1.0000003f;//7位小数位,总共8位
        float f8 = 1.00000003f;//8位小数位,总共9位
        float f_8 = 10.000003f;//6位小数位,总共8位
        float f_9 = 10.0000003f;//7位小数位,总共9位
        float f_10 = 10.00000003f;//8位小数位,总共10位

        double d15 = 1.000000000000003;//15位小数位,总共16位
        double d16 = 1.0000000000000003;//16位小数位,总共17位
        double d17 = 1.00000000000000003;//17位小数位,总共18位
        double d_17 = 10.000000000000003;//15位小数位,总共17位
        double d_18 = 10.0000000000000003;//16位小数位,总共18位
        double d_19 = 10.00000000000000003;//17位小数位,总共19位

        System.out.println("结果为false证明 == 校验到了小数点位, 精确度可信");
        System.out.println("float(7位有效,6位小数)    1.000003f  == 1           的结果是:" + (f6==1));
        System.out.println("float(8位有效,7位小数)    1.0000003f == 1           的结果是:" + (f7==1));
        System.out.println("float(9位有效,8位小数)    1.00000003f  == 1         的结果是:" + (f8==1));
        System.out.println("float(8位有效,6位小数)    10.000003f  == 10         的结果是:" + (f_8==10));
        System.out.println("float(9位有效,7位小数)    10.0000003f  == 10        的结果是:" + (f_9==10));
        System.out.println("float(10位有效,8位小数)   10.00000003f  == 10       的结果是:" + (f_10==10));
        System.out.println("------------------");

        System.out.println("double(16位有效,15位小数) 1.000000000000003 == 1    的结果是:" + (d15==1));
        System.out.println("double(17位有效,16位小数) 1.0000000000000003 == 1   的结果是:" + (d16==1));
        System.out.println("double(18位有效,17位小数) 1.00000000000000003 == 1  的结果是:" + (d17==1));
        System.out.println("double(17位有效,15位小数) 10.000000000000003 == 10  的结果是:" + (d_17==10));
        System.out.println("double(18位有效,16位小数) 10.0000000000000003 == 10 的结果是:" + (d_18==10));
        System.out.println("double(19位有效,17位小数) 10.00000000000000003 == 10的结果是:" + (d_19==10));
    }
}

結果がfalseの場合、小数点は意味があります。つまり、正確な場所です。

結果から、floatは有効数字8桁、倍精度17桁まで正確である可能性があります。

 

f1 == f2を使用して2つの数値が等しいと判断できない理由は、f1とf2は2つの異なる数値である可能性がありますが、浮動小数点の精度の制限により、2つの数値が等しいと誤って判断される可能性があるためです。ポイント数!

 

おすすめ

転載: blog.csdn.net/liyang_nash/article/details/104527239