Gebruikersavatar
Ruben01
Artikelen: 0
Berichten: 2.902
Lid geworden op: wo 02 mei 2007, 18:10

[java] basisprobleem

Waarschijnlijk stel ik een heel domme vraag maar ik zou het antwoord gewoon graag weten zodat ik het nooit meer kan vergeten.

Ik heb zojuist een klein stukje code geschreven:

Code: Selecteer alles

public class Machten

{

public static void main(String[] argumenten)

{

Input l=new Input();

double x,y;z;

System.out.print("Geef het getal x in: ");

x=l.readDouble();

System.out.print("Geef het getal y in: ");

y=l.readDouble();

z=Math.exp(y*Math.log(x));

System.out.println(x+ " tot de macht "+y+ " = " +z);

}

}
Iedereen zal direct zien dat dit een nogal 'dom' programma is maar het is gewoon om wat zaken te testen. Als ik in het bovenstaan voor x het getal 2 ingeef en voor y het getal 3 dan verwacht je normaal een 8. Mijn computer geeft 7.9999...

Ik heb denk ik wel ergens tijdens een les de oplossing daarvoor gezien maar blijkbaar zit deze niet meer in men geheugen :D .

Kan er mij iemand helpen ?
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: [java] basisprobleem

Stel je kan maximaal 3 cijfers achter de komma onthouden. Als ik je nu vraag om 1/3 uit te rekenen, zal jij als antwoord 0.333 geven. Als ik nu vraag om dit te vermenigvuldigen met 3, kom je op 0.999. Zie je nu waar het fout gaat?
Gebruikersavatar
Ruben01
Artikelen: 0
Berichten: 2.902
Lid geworden op: wo 02 mei 2007, 18:10

Re: [java] basisprobleem

Stel je kan maximaal 3 cijfers achter de komma onthouden. Als ik je nu vraag om 1/3 uit te rekenen, zal jij als antwoord 0.333 geven. Als ik nu vraag om dit te vermenigvuldigen met 3, kom je op 0.999. Zie je nu waar het fout gaat?
Ik ben al aan het proberen geweest met mijn x,y anders te declareren maar dan geeft mijn compiler als fout "possible lost of precision".

Ik denk dat ik mijn verschillende 'classes' wat door elkaar aan het gooien ben :D .
Gebruikersavatar
Redbok
Artikelen: 0
Berichten: 155
Lid geworden op: do 03 jan 2008, 11:12

Re: [java] basisprobleem

Vind je dat zo'n probleem?

Een computer kan nu eenmaal niet alle cijfers meenemen. Paketten als matlab maken ook dergelijke afrondingsfouten...
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: [java] basisprobleem

Ruben01 schreef:Ik ben al aan het proberen geweest met mijn x,y anders te declareren maar dan geeft mijn compiler als fout "possible lost of precision".

Ik denk dat ik mijn verschillende 'classes' wat door elkaar aan het gooien ben :D .
Dit is geen antwoord op mijn vraag. Ik vraag of je ziet hoe de beperking van maar drie cijfers leidt tot een fout antwoord. Deze kennis gekoppeld met het begrip dat een computer geen oneindige precisie heeft, geeft je inzicht in waarom er 7.999nogwat uitkomt in plaats van 8.
Gebruikersavatar
Cycloon
Artikelen: 0
Berichten: 4.810
Lid geworden op: ma 24 jan 2005, 20:56

Re: [java] basisprobleem

Dit kom idd gewoon door afrondingsfouten die ontstaan in de wiskundige functies om machten en logaritmen te berekenen.
Gebruikersavatar
Ruben01
Artikelen: 0
Berichten: 2.902
Lid geworden op: wo 02 mei 2007, 18:10

Re: [java] basisprobleem

Redbok schreef:Vind je dat zo'n probleem?

Een computer kan nu eenmaal niet alle cijfers meenemen. Paketten als matlab maken ook dergelijke afrondingsfouten...
Ja dat weet ik wel ...
Dit is geen antwoord op mijn vraag. Ik vraag of je ziet hoe de beperking van maar drie cijfers leidt tot een fout antwoord. Deze kennis gekoppeld met het begrip dat een computer geen oneindige precisie heeft, geeft je inzicht in waarom er 7.999nogwat uitkomt in plaats van 8.
Dat snap ik.

Volgens was mijn vraagstelling niet 100% en daarom probeer ik hieronder nog een keer:

Momenteel is die 7.999 niet zo'n groot probleem omdat ik deze aflees van mijn scherm na de berekening en dus weet ik ook dat het 8 moet zijn.

Wanneer ik nu in mijn programma bijvoorbeeld een opdracht ga schrijven die uitgevoerd moet worden indien z=8 dan gaat hij die nu niet uitvoeren omdat z=7,999...

Ik zou dus een methode willen weten voor wanneer ik in een volgend programma het bovenstaande probleem krijg, bestaat zoiets ?

Alvast bedankt voor jullie reacties !
Gebruikersavatar
Cycloon
Artikelen: 0
Berichten: 4.810
Lid geworden op: ma 24 jan 2005, 20:56

Re: [java] basisprobleem

Ik ken de overeenkomstige functies niet in Java, maar je zou iets als round() kunnen gebruiken of fabs().

Edit: Mss nog een kleine verduidelijking bij fabs():

Code: Selecteer alles

if (fabs(8-z) < 0.001) { voer_actie_uit() }
Dit is wel c++ code, maar zal wel ongeveer gelijklopend zijn met java.
Gebruikersavatar
Nobully
Artikelen: 0
Berichten: 112
Lid geworden op: wo 25 jan 2006, 12:57

Re: [java] basisprobleem

kkan je je getal niet eens als een integer declareren ?
Gebruikersavatar
Ruben01
Artikelen: 0
Berichten: 2.902
Lid geworden op: wo 02 mei 2007, 18:10

Re: [java] basisprobleem

kkan je je getal niet eens als een integer declareren ?
Met de onderstaande code krijg ik: "possible loss of precision"

Code: Selecteer alles

public class Logaritme

{

public static void main(String[] argumenten)

{

Input l=new Input();

double x,y;

int z;

System.out.print("Geef het getal x in: ");

x=l.readDouble();

System.out.print("Geef het getal y in: ");

y=l.readDouble();

z=Math.exp(y*Math.log(x));

System.out.println(x+ " tot de macht "+y+ " = " +z);

}

}
Als ik x en y ook als een integer ga declareren dan krijg ik dezelfde foutmelding.
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: [java] basisprobleem

Als ik x en y ook als een integer ga declareren dan krijg ik dezelfde foutmelding.
Deze code zou niet eens moeten compileren (vanwege een type mismatch).
Gebruikersavatar
Ruben01
Artikelen: 0
Berichten: 2.902
Lid geworden op: wo 02 mei 2007, 18:10

Re: [java] basisprobleem

Deze code zou niet eens moeten compileren (vanwege een type mismatch).
Dit krijg ik:

Code: Selecteer alles

G:\ICT\Logaritme.java:12: possible loss of precision

found   : double

required: int

z=Math.exp(y*Math.log(x));

  ^

1 error

Process completed.
Gebruikersavatar
Nobully
Artikelen: 0
Berichten: 112
Lid geworden op: wo 25 jan 2006, 12:57

Re: [java] basisprobleem

tklinkt stom

maar in de les hebben wij geleerd om als je bvb iets declareerd

kzal een vb geven

private double a

private double b

wel als je dan dan double a wilt kwadrateren moet je a*a doen, zo hebben wij leren kwadrateren omdat er anders idd een fout is, dus ik denk dat het miss mogelijk moet zijn om met een machten meer dan 2 te werken als je een soort van for loop opstelt tot een getal.

dit zou miss een oplossing zijn zodat wanneer je tot je een bepaald getal bereikt hebt moet vermenigvuldigen met a
Gebruikersavatar
Ruben01
Artikelen: 0
Berichten: 2.902
Lid geworden op: wo 02 mei 2007, 18:10

Re: [java] basisprobleem

@Nobully: dat kan wel een oplossing bieden voor wanneer je een probleem hebt bij dat kwadrateren.

Ik zoek meer een oplossing voor de 'rekenfout' die gemaakt wordt. In die geval is de berekening met machten maar wanneer het iets anders is dan werkt jouw methode waarschijnlijk niet.
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: [java] basisprobleem

Ik zoek meer een oplossing voor de 'rekenfout' die gemaakt wordt.
Als je denkt dat daar een oplossing voor is dan heb je niet goed begrepen wat ik je probeerde te zeggen. Er zitten oneindig veel getallen tussen 0 en 1. Stel dat je deze allemaal precies wilt kunnen weergeven in een computer. Hoeveel bits heb je dan nodig voor de representatie van een getal?

Terug naar “Informatica en programmeren”