[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