/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
float casting laver ballade
Fra : Kim Schulz


Dato : 30-04-04 10:25

hejsa
jeg har et underligt problem med float casts.

case 1:
jeg beregner en simpel linjelængde.
double tempSqr = Math.sqrt((double) ((c.getX()-lastX)*(c.getX()-lastX) + (c.getY()-lastY)*(c.getY()-lastY)));
denne kastes til float og i det fejlende tilfælde giver det: 6.3639607

case 2:
jeg har beregnet samme tal via lommeregner og fået 6.36396103068
Denne værdi caster jeg med "(float) nummer" og så får jeg: 6.36391


hvorfor er det lige at denne cast er forskellig? det er jo samme tal jeg caster,
den ene gang er det gemt i en double og den anden gang er det hardcoded/skrevet direkte
ind.

MVH
Kim Schulz


 
 
Niels Dybdahl (30-04-2004)
Kommentar
Fra : Niels Dybdahl


Dato : 30-04-04 11:03

> hejsa
> jeg har et underligt problem med float casts.
> case 1:
> jeg beregner en simpel linjelængde.
> double tempSqr = Math.sqrt((double) ((c.getX()-lastX)*(c.getX()-lastX) +
(c.getY()-lastY)*(c.getY()-lastY)));
> denne kastes til float og i det fejlende tilfælde giver det: 6.3639607
> case 2:
> jeg har beregnet samme tal via lommeregner og fået 6.36396103068
> Denne værdi caster jeg med "(float) nummer" og så får jeg: 6.36391
> hvorfor er det lige at denne cast er forskellig? det er jo samme tal jeg
caster,
> den ene gang er det gemt i en double og den anden gang er det
hardcoded/skrevet direkte
> ind.

Det er nok fordi ingen af tallene 6.3639607, 6.363961 og 6.36396103068 kan
skrives præcist som float. float er baseret på grundtallet 2 og kan normalt
ikke representere "kommatal" baseret på grundtallet 10 præcist.
De eneste tal du kan skrive præcist som float er dem du kan komme frem til
ved at addere 1, 0.5, 0.25, 0.125 etc så hvis tallet ikke slutter på cifret
5, kan du være sikker på at det ikke kan representeres korrekt.
Dvs ingen af de tal som du har nævnt er de samme tal, når de først er inde i
computeren.

Niels Dybdahl



Ukendt (03-05-2004)
Kommentar
Fra : Ukendt


Dato : 03-05-04 17:29

Og ellers kan der henvises til http://www.validlab.com/goldberg/paper.pdf
"What Every Computer Scientis Should Know About Floating-Point Arithmetic"

/nobody important


"Niels Dybdahl" <ndy@fjern.detteesko-graphics.com> wrote in message
news:4092246f$0$170$edfadb0f@dtext02.news.tele.dk...
> > hejsa
> > jeg har et underligt problem med float casts.
> > case 1:
> > jeg beregner en simpel linjelængde.
> > double tempSqr = Math.sqrt((double) ((c.getX()-lastX)*(c.getX()-lastX) +
> (c.getY()-lastY)*(c.getY()-lastY)));
> > denne kastes til float og i det fejlende tilfælde giver det: 6.3639607
> > case 2:
> > jeg har beregnet samme tal via lommeregner og fået 6.36396103068
> > Denne værdi caster jeg med "(float) nummer" og så får jeg: 6.36391
> > hvorfor er det lige at denne cast er forskellig? det er jo samme tal jeg
> caster,
> > den ene gang er det gemt i en double og den anden gang er det
> hardcoded/skrevet direkte
> > ind.
>
> Det er nok fordi ingen af tallene 6.3639607, 6.363961 og 6.36396103068 kan
> skrives præcist som float. float er baseret på grundtallet 2 og kan
normalt
> ikke representere "kommatal" baseret på grundtallet 10 præcist.
> De eneste tal du kan skrive præcist som float er dem du kan komme frem til
> ved at addere 1, 0.5, 0.25, 0.125 etc så hvis tallet ikke slutter på
cifret
> 5, kan du være sikker på at det ikke kan representeres korrekt.
> Dvs ingen af de tal som du har nævnt er de samme tal, når de først er inde
i
> computeren.
>
> Niels Dybdahl
>
>



Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408178
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste