1 van 2
[java] basisprobleem
Geplaatst: vr 08 feb 2008, 09:29
door Ruben01
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
.
Kan er mij iemand helpen ?
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 11:33
door EvilBro
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?
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 11:52
door Ruben01
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
.
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 12:10
door Redbok
Vind je dat zo'n probleem?
Een computer kan nu eenmaal niet alle cijfers meenemen. Paketten als matlab maken ook dergelijke afrondingsfouten...
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 12:17
door EvilBro
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
.
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.
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 13:04
door Cycloon
Dit kom idd gewoon door afrondingsfouten die ontstaan in de wiskundige functies om machten en logaritmen te berekenen.
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 13:05
door Ruben01
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 !
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 13:06
door Cycloon
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():
Dit is wel c++ code, maar zal wel ongeveer gelijklopend zijn met java.
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 13:10
door Nobully
kkan je je getal niet eens als een integer declareren ?
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 13:20
door Ruben01
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.
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 14:36
door EvilBro
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).
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 14:55
door Ruben01
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.
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 15:27
door Nobully
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
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 15:53
door Ruben01
@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.
Re: [java] basisprobleem
Geplaatst: vr 08 feb 2008, 16:15
door EvilBro
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?