/ 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
Meget meget underligt resultat
Fra : Rune Klausen


Dato : 22-05-02 19:26

Her er koden, de resultater som kommer ud, undre mig meget, er der nogen som
kan forklare mig hvorfor de ser sådan ud ?

//kode
public class test
{
public static void main(String args[])
{
float testX=0, testY=0, dispX=0,dispY=0;

for(int i = 0; i<5; i++)
{

testX += 0.2;
testY -= 0.2;

dispX = 100 * testX;
dispY = 100 * testY;

System.out.println("Display X: " + dispX);
System.out.println("Display Y: " + dispY);

}

for(int i = 0; i<10; i++)
{

testX -= 0.2;
testY += 0.2;

dispX = 100 * testX;
dispY = 100 * testY;

System.out.println("Display X: " + dispX);
System.out.println("Display Y: " + dispY);

}
}

}
//kode slut


-Rune



 
 
Lars Dam (22-05-2002)
Kommentar
Fra : Lars Dam


Dato : 22-05-02 19:41

On Wed, 22 May 2002 20:25:41 +0200, "Rune Klausen"
<rune.klausen@paradis.dk> wrote:

>Her er koden, de resultater som kommer ud, undre mig meget, er der nogen som
>kan forklare mig hvorfor de ser sådan ud ?
>
>//kode
>public class test
>{
> public static void main(String args[])
> {
> float testX=0, testY=0, dispX=0,dispY=0;
>
> for(int i = 0; i<5; i++)
> {
>
> testX += 0.2;
> testY -= 0.2;
>
> dispX = 100 * testX;
> dispY = 100 * testY;

Uden at gennemteste det, så gætter jeg på at det er fordi din
mellemregning bliver castet til en int, og dermed afrundet, prøv:

> dispX = 100.0 * testX;

etc. istedet.

100 bliver betragtet som en int, og når du ganger en int med en float,
får du en int, som du så caster (uden problemer) over i en float. Ved
at gange med 100.0 (alternativt med 100.0f el. 100.0d) istedet for
100, ganger du to floats med hindanden, og dit resultat er en float.

vh. ld


Lars Mosegård (23-05-2002)
Kommentar
Fra : Lars Mosegård


Dato : 23-05-02 16:28


"Lars Dam" <larsdamXXspamXXprotectionXX@post2.tele.dk> skrev i en meddelelse
news:9dpneu4ifb8uem78gbkcerj809q4ai6ge7@4ax.com...
> On Wed, 22 May 2002 20:25:41 +0200, "Rune Klausen"
> <rune.klausen@paradis.dk> wrote:
>
> >
> > dispX = 100 * testX;
>
> Uden at gennemteste det, så gætter jeg på at det er fordi din
> mellemregning bliver castet til en int, og dermed afrundet, prøv:
>
> > dispX = 100.0 * testX;
>
> etc. istedet.
>
> 100 bliver betragtet som en int
>
Jep

>, og når du ganger en int med en float, får du en int,
>
Nix, compileren vil konvertere de 100 til en float (kaldes på almindeligt pænt
dansk: arithmetic promosion conversion

> som du så caster (uden problemer) over i en float
>
Der foregår ingen cast!

Mvh
Lars



Filip Larsen (22-05-2002)
Kommentar
Fra : Filip Larsen


Dato : 22-05-02 19:45

Rune Klausen skrev

> Her er koden, de resultater som kommer ud, undre mig meget, er der nogen
som
> kan forklare mig hvorfor de ser sådan ud ?

Måske du kunne forklare hvad det er der undre dig.


Mvh,
--
Filip Larsen <filip.larsen@mail.dk>



Rune Klausen (22-05-2002)
Kommentar
Fra : Rune Klausen


Dato : 22-05-02 20:37


"Filip Larsen" <filip.larsen@mail.dk> wrote in message
news:acgotj$mi0$1@news.cybercity.dk...
> Rune Klausen skrev
>
> > Her er koden, de resultater som kommer ud, undre mig meget, er der nogen
> som
> > kan forklare mig hvorfor de ser sådan ud ?
>
> Måske du kunne forklare hvad det er der undre dig.

Hvis du ser på talne, så vil du nok undre dig over, at der pludselig kommer
nogle tal med "mange" decimaler

Display X: 20.0

Display Y: -20.0

Display X: 40.0

Display Y: -40.0

Display X: 60.000004

Display Y: -60.000004

Display X: 80.0

Display Y: -80.0

Display X: 100.0

Display Y: -100.0

Display X: 80.0

Display Y: -80.0

Display X: 60.000004

Display Y: -60.000004

Display X: 40.000004

Display Y: -40.000004

Display X: 20.000004

Display Y: -20.000004

Display X: 3.2782555E-6

Display Y: -3.2782555E-6

Display X: -19.999998

Display Y: 19.999998

Display X: -39.999996

Display Y: 39.999996

Display X: -59.999996

Display Y: 59.999996

Display X: -79.99999

Display Y: 79.99999

Display X: -99.99999

Display Y: 99.99999



-Rune




Filip Larsen (22-05-2002)
Kommentar
Fra : Filip Larsen


Dato : 22-05-02 21:11

Rune Klausen skrev

> > Måske du kunne forklare hvad det er der undre dig.
>
> Hvis du ser på talne, så vil du nok undre dig over, at der pludselig
kommer
> nogle tal med "mange" decimaler

Det er en "normal" effekt af at regne med endelig præcision på tal (her 0.1)
der ikke kan repræsenteres some endelige binære tal. Emnet er forholdvis tit
oppe og vende i comp.lang.java.* grupperne, så Hr. Roedy har det med i sin
Java Glossary:

http://www.mindprod.com/jglossf.html#FLOATINGPOINT


Mvh,
--
Filip Larsen <filip.larsen@mail.dk>



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste