Java Puzzle 26 – The float in Loop
Merhaba Arkadaslar
Ornek kodumuzu inceleyelim ;
Counter.java
package _26.float$.inloop; public class Counter { public static void main(String[] args) { final int START = 2000000000; // 2147483647 Integer.MAX_VALUE int counter = 0; for (float f = START; f < START + 50; f++) counter++; System.out.println(counter); } }
Ornegimizi calistirdigimizda ciktimiz ne olacak ? Dongumuzun 50 kere calisacagini ve counter ‘in 50 oldugunu dusunebiliriz.
Fakat ornegimizi calistirdigimizda sonucun 0(sifir) oldugunu goruruz.Burada f++ islemi hic calismamaktadir! Peki bu durum nasil olmaktadir ?
2,000,000,000 degeri Integer.MAX_VALUE degerine bir hayli yakindir , bu nedenle bu sayiyiyi ifade etmek icin 31 bit gereklidir. Bununla birlikte float veri tipi precision/hassasiyet olarak 24 bit destek saglamaktadir. Buyuk degere sahip bir float sayiyi artirmak increment(++) bu sayinin degerini degistirmeyecektir.
Burada START degeri cok buyuk oldugu icin , float f degiskenine assign edildikten sonra , bu sayinin 50 fazlasi ayni degere sahip olacaktir.
Yani su sart true olacaktir ;
(float)2000000000 == 2000000050
Dolayisiyla sart saglandigi icin donguye girmeyecektir.
Bir baska ornek olarak ;
package _26.float$.inloop; public class WeirdFloat { public static void main(String[] args) { float f1 = 2000000000f; float f2 = ++f1; float f3 = f1 + 1; float f4 = f1 + 64; System.out.println(f1 == f2); System.out.println(f2 == f3); System.out.println(f3 == f4); System.out.println(f1 == f4); System.out.println("f1: " + f1); System.out.println("f2: " + f2); System.out.println("f3: " + f3); System.out.println("f4: " + f4); } }
Ornegimizi calistirdigimizda;
true true true true f1: 2.0E9 f2: 2.0E9 f3: 2.0E9 f4: 2.0E9
double ve float ile calisirken dikkatli olalim. Dongu icerisinde kullandigimizda ozellikle beklenmeyen durumlar ortaya cikabilir.
Github kaynak kodlar / Source Code
leventerguder/injavawetrust-puzzler
Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer
Leave a Reply