Floatの謎

4020 ワード

まずいくつかの例を見てみましょう.
public class Thirtyfirst1{

        public static void main(String[] args){

                int i = 2000000000;

                int count = 0;

                for(float f = i; f < i + 50 ; f ++){

                        count++;

                }

                System.out.println(count);

        }

}

どのくらい出力されますか?
public class Thirtyfirst1{

        public static void main(String[] args){

                int i = 2000000000;

                int count = 0;

                for(float f = i; f < i + 64 ; f ++){

                        count++;

                }

                System.out.println(count);

        }

}

これはいくら出力されますか?
public class Thirtyfirst1{

        public static void main(String[] args){

                int i = 2000000000;

                int count = 0;

                for(float f = i; f < i + 65 ; f ++){

                        count++;

                }

                System.out.println(count);

        }

}

この出力はいくらですか?
第一題:0
第二題:0
第三題:デッドサイクル
さらに次の解析を見ると浮動小数点数の記憶とintがfloatを回すときの手順がわかる(JAva浮動小数点数剖析)
一、まず20000000のバイナリを見てみましょう
01110111  00110101  10010100  0(0000000)

かっこ内は浮動小数点に変換して捨てる末尾になります
浮動小数点数に変換後
0  10011101  11011100 11010110 0101000
S    E          M(23 )

二、次に20000000+64を観察する
01110111  00110101  10010100  0(1000000)

浮動小数点数に変換
0  10011101  11011100 11010110 0101000

20,000,000,000,000,000の浮動小数点ストレージとそっくり
三、次に20000000+65を観察する
01110111  00110101  10010100  0(1000001)

明らかに
01110111  00110101  10010100  0

01110111  00110101  10010100  0(1000001)
01110111  00110101  10010100  1

明らかに中間の数は下の数に近いので、浮動小数点化後
0  10011101  11011100 11010110 0101001

20,000,000,000,000の浮動小数点ストレージより1
したがって、前の2つのプログラムは0を印刷することで理解できます(ポイントは浮動小数点数に変換する方法と、尾を捨てる方法を知ることです).
四、1の浮動小数点表示
0  01111111  0000000 00000000 00000000

五、浮動小数点数の加減演算
階層:
段差30
従ってf++はfにほとんど影響を及ぼさない
だから死のサイクルになる!!!