Kruczki przy użyciu typów zmiennoprzecinkowych

Zgadnij co wypisze poniższy fragment kodu:

                Set iSet = new HashSet();
                Set fSet = new HashSet();
                Set dSet = new HashSet();
		int start = Integer.MAX_VALUE - 10;
		int stop = Integer.MAX_VALUE;
		for (int i = start; i < stop; ++i) {
			iSet.add(i);
			fSet.add((float)i);
			dSet.add((double)i);
		}
		System.out.println(iSet.size());
		System.out.println(fSet.size());
		System.out.println(dSet.size());


Jeśli myślisz, że trzy razy 10 – mylisz się. Output będzie wyglądał tak:
10
1
10

Wynika to z tego, że nie dla każdej wartości int istnieje odpowiednik zmiennoprzecinkowego typu float. Pierwszą taką dodatnią liczbą naturalną jest 16777217. Dlatego też poniższy fragment kodu wypisze true:

float f = 16777216f;
System.out.println (f + 1 == f);

Należy sobie zdawać sprawę ze specyfiki typów zmiennoprzecinkowych. Istotnym spostrzeżeniem jest to, że w typie double mieszczą się wszystkie wartości int, więc gdy nie potrzebujemy oszczędzać pamięci wygodniej jest korzystać z niego.

Zacheusz Siedlecki

Komentarze

Chcesz coś napisać?





*