[Java lista] ket alap kerdes

Zsombor gzsombor at gmail.com
2007. Feb. 14., Sze, 13:12:20 CET


On 2/14/07, istvan.ketler at lhsystems.com <istvan.ketler at lhsystems.com> wrote:
>
> > 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


Valamint olyan dolgokat is érdemes tudni, hogy a lebegőpontos aritmetika még
csak nem is asszociativ:
 (a + b) - b != a + (b - b)

ĂĽdv
 Zs
--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: http://javagrund.hu/pipermail/javalist/attachments/20070214/9da2b11a/attachment.html 


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