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

Print Friendly

Leave a Reply

Your email address will not be published. Required fields are marked *