[java] basisprobleem

Moderators: jkien, Xilvo

Gebruikersavatar
Berichten: 2.902

[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 ?

Berichten: 7.068

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
Berichten: 2.902

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
Berichten: 155

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...

Berichten: 7.068

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
Berichten: 4.810

Re: [java] basisprobleem

Dit kom idd gewoon door afrondingsfouten die ontstaan in de wiskundige functies om machten en logaritmen te berekenen.

Gebruikersavatar
Berichten: 2.902

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
Berichten: 4.810

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
Berichten: 112

Re: [java] basisprobleem

kkan je je getal niet eens als een integer declareren ?

Gebruikersavatar
Berichten: 2.902

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.

Berichten: 7.068

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
Berichten: 2.902

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
Berichten: 112

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
Berichten: 2.902

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.

Berichten: 7.068

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?

Reageer