[Java lista] ket alap kerdes

istvan.ketler at lhsystems.com istvan.ketler at lhsystems.com
2007. Feb. 14., Sze, 12:19:58 CET


> Koszi. En igazabol azt nem ertem, hogy ha letezik olyan 
> allapota a floatnak, ami pontosan 2.36-nak latszik, es 
> letezik ilyen allapota a double-nek is (1. es 3. eset), akkor 
> mi tortenik a konvertalasnal, ami miatt pontatlan lesz az 
> abrazolas a 2. esetben.

Végső soron azért, mert a double esetén nagyobb felbontással tudja leképezni a bináris számokat a decimálisokra. Ebből az következik, hogy ahol a float bitminta csak egy decimális számnak felel meg, ott a double többnek. Ebből a több számból fog választani egyet valamilyen algoritmus szerint. (Na ez azért most jó mórickásra sikeredett, de a háttérben nagyjából ilyesmi van). Egyébként próbáld ki olyan számmal, amit pontosan fel lehet írni 2**(-x) formában, mondjuk 0.001953125 (vagyis 2**-9). Az ilyeneket egész sokáig hajszálpontosan ugyanazzá konvertálja.

Másként megfogalmazva, ha a szám pontosan felírható szumma 2**(-xi) törtek összegeként úgy, hogy elfér a float bitjein, akkor pontosan fogja konvertálni. Ha nem írható fel, akkor viszont a nagyobb felbontás miatt választania kell egyet a több közül. Majd nézd meg, hogy visszafelé nincs ilyen baj, hiszen ekkor szűkül a felbontás (double d = 2.36d;  float f = (float) d;).

S ha már itt tartunk, a helyzet az, hogy annak idején nem viccből oktatták nekünk (és talán oktatják még ma is), hogy lebegőpontos művelet eredményét (legyen single vagy double) nem hasonlítjuk nullához:

float f;
...
if (f == 0.0f) { ... }

hanem a nulla egy alkalmasan megválasztott kis epszilon kornyezetét használjuk inkább:

if (-epszilon <= f && f <= epszilon) { ... }

Üdvözlettel,

Iván


További információk a(z) Javalist levelezőlistáról