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ć?