Springen naar inhoud

[java] basisprobleem


  • Log in om te kunnen reageren

#1

Ruben01

    Ruben01


  • >1k berichten
  • 2902 berichten
  • Ervaren gebruiker

Geplaatst op 08 februari 2008 - 09:29

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:

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 ?
BOINC mee met het WSF-team: <a href="http://www.wetenscha...howtopic=60653" target="_blank">http://www.wetenscha...topic=60653</a>

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 08 februari 2008 - 11:33

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?

#3

Ruben01

    Ruben01


  • >1k berichten
  • 2902 berichten
  • Ervaren gebruiker

Geplaatst op 08 februari 2008 - 11:52

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 .
BOINC mee met het WSF-team: <a href="http://www.wetenscha...howtopic=60653" target="_blank">http://www.wetenscha...topic=60653</a>

#4

Redbok

    Redbok


  • >100 berichten
  • 155 berichten
  • Ervaren gebruiker

Geplaatst op 08 februari 2008 - 12:10

Vind je dat zo'n probleem?

Een computer kan nu eenmaal niet alle cijfers meenemen. Paketten als matlab maken ook dergelijke afrondingsfouten...

#5

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 08 februari 2008 - 12:17

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.

#6

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 08 februari 2008 - 13:04

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

#7

Ruben01

    Ruben01


  • >1k berichten
  • 2902 berichten
  • Ervaren gebruiker

Geplaatst op 08 februari 2008 - 13:05

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 !
BOINC mee met het WSF-team: <a href="http://www.wetenscha...howtopic=60653" target="_blank">http://www.wetenscha...topic=60653</a>

#8

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 08 februari 2008 - 13:06

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():

if (fabs(8-z) < 0.001) { voer_actie_uit() }

Dit is wel c++ code, maar zal wel ongeveer gelijklopend zijn met java.

Veranderd door Cycloon, 08 februari 2008 - 13:09


#9

Nobully

    Nobully


  • >100 berichten
  • 112 berichten
  • Ervaren gebruiker

Geplaatst op 08 februari 2008 - 13:10

kkan je je getal niet eens als een integer declareren ?

#10

Ruben01

    Ruben01


  • >1k berichten
  • 2902 berichten
  • Ervaren gebruiker

Geplaatst op 08 februari 2008 - 13:20

kkan je je getal niet eens als een integer declareren ?

Met de onderstaande code krijg ik: "possible loss of precision"

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.
BOINC mee met het WSF-team: <a href="http://www.wetenscha...howtopic=60653" target="_blank">http://www.wetenscha...topic=60653</a>

#11

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 08 februari 2008 - 14:36

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

#12

Ruben01

    Ruben01


  • >1k berichten
  • 2902 berichten
  • Ervaren gebruiker

Geplaatst op 08 februari 2008 - 14:55

Deze code zou niet eens moeten compileren (vanwege een type mismatch).

Dit krijg ik:

G:\ICT\Logaritme.java:12: possible loss of precision
found   : double
required: int
		z=Math.exp(y*Math.log(x));
				  ^
1 error

Process completed.
BOINC mee met het WSF-team: <a href="http://www.wetenscha...howtopic=60653" target="_blank">http://www.wetenscha...topic=60653</a>

#13

Nobully

    Nobully


  • >100 berichten
  • 112 berichten
  • Ervaren gebruiker

Geplaatst op 08 februari 2008 - 15:27

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

#14

Ruben01

    Ruben01


  • >1k berichten
  • 2902 berichten
  • Ervaren gebruiker

Geplaatst op 08 februari 2008 - 15:53

@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.
BOINC mee met het WSF-team: <a href="http://www.wetenscha...howtopic=60653" target="_blank">http://www.wetenscha...topic=60653</a>

#15

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 08 februari 2008 - 16:15

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?





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures