Springen naar inhoud

Numeriek exacter dan exact?


  • Log in om te kunnen reageren

#1

Civilo

    Civilo


  • 0 - 25 berichten
  • 15 berichten
  • Gebruiker

Geplaatst op 01 maart 2009 - 21:47

Goede(dagdeel),

Ik heb onlangs een vrij "zware" exacte oplossing voor een vergelijking geprogrammeerd in c#. Tijdens een controle van een het programmaatje kwam ik er achter dat de door het programma gevonden oplossingen afwijken, zij het miniem, van de juiste waarden. Voorbeeldje: ik zocht naar een snijpunt tussen twee vergelijkingen, waarvan ik zeker wist dat dit op x = 50 ligt. Mijn programma geeft echter x = 50.000016.

Dit is op zich niet storend, de fout is maar klein, maar ik ben bang dat deze kan gaan "doorwerken".

Ik kan natuurlijk met een numerieke oplossing de exacte waarde beter benaderen dan met een exacte oplossing, alleen dit kost meer rekentijd.

Zijn er nog andere oplossingen?

P.S. Alle parameters zijn van het type double.

Bij voorbaat dank.

C

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

#2

Vladimir Lenin

    Vladimir Lenin


  • >250 berichten
  • 829 berichten
  • Ervaren gebruiker

Geplaatst op 01 maart 2009 - 22:11

Nou het probleem met programmeren is dat een exact getal op een computer niet bestaat. Pi bestaat niet op een computer weliswaar is een computer makkelijk in staat om op een tiental decimalen nauwkeurig te rekenen, maar daarmee houdt het ook op. Je zal dus vrede moeten nemen met dergelijke afwijkingen. Dat heeft niets met C# te maken, elke taal maakt dezelfde blunders wat dat betreft. Nu de oplossing: Er bestaan types die een hogere preciese garanderen, ik denk dat je (aan de afwijking te zien) een float gebruikt. Indien je de precisie preciesie wil uitbreiden kan je een double gebruiken of indien het nog exacter moet misschien een decimal. Of je kan ook zoeken op internet naar types die door programmeurs zelf geschreven zijn, die nog hogere preciese garanderen.

PS. Hoe staat het eigenlijk met C#. (zie leren programmeren) :D

edit: heb nu pas gezien dat je de double vermeld had.
"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."
--Vladimir Lenin-- (Владимир Ильич Ульянов)

#3

*_gast_PeterPan_*

  • Gast

Geplaatst op 02 maart 2009 - 11:21

Zo'n grote afwijking wijst op een programmeerfout.

#4

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 02 maart 2009 - 12:14

Zo'n grote afwijking wijst op een programmeerfout.


Tenzij de vergelijking iteratief is opgelost.
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

#5

Vladimir Lenin

    Vladimir Lenin


  • >250 berichten
  • 829 berichten
  • Ervaren gebruiker

Geplaatst op 02 maart 2009 - 12:49

Het kan maar ikzelf gebruik soms newtons methode en zo'n grote fout heb ik nog niet meegemaakt
"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."
--Vladimir Lenin-- (Владимир Ильич Ульянов)

#6

dirkwb

    dirkwb


  • >1k berichten
  • 4173 berichten
  • Moderator

Geplaatst op 02 maart 2009 - 13:18

Tenzij de vergelijking iteratief is opgelost.

Inderdaad het gaat dus om de numerieke methode die je toepast en deze heeft een discretisatiefout...
Quitters never win and winners never quit.

#7

Civilo

    Civilo


  • 0 - 25 berichten
  • 15 berichten
  • Gebruiker

Geplaatst op 02 maart 2009 - 22:00

Nope geen programmeerfout. Dit soort fouten komt ook vaak bij excel voor wanneer je in een enkele formule veelvuldig goniometrische functies gebruikt. In combinatie met machtvereffenen kan de onnauwkeurigheid flink oplopen.

Tovarishch Lenin, wat betreft het leren van programmeren: ik stel steeds een doel waar ik naar toe werk, ik leer on the fly. Het is natuurlijk niet de juiste methode maar het werkt voor mij. Ik merk dat ik qua theorie nog wat tekortschiet, dat ben ik nu beetje bij beetje aan het oppakken.
Ik krab natuurlijk alleen nog maar het oppervlak op het moment, maar ik begin wel steeds vaker voor me te zien hoe ik iets kan oplossen in c#.

Gr. C

#8

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 02 maart 2009 - 22:53

Het kan maar ikzelf gebruik soms newtons methode en zo'n grote fout heb ik nog niet meegemaakt


De fout in Newton's methode hangt nog altijd af van de convergentievoorwaarde die je stelt.
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

#9

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 03 maart 2009 - 08:08

ik zocht naar een snijpunt tussen twee vergelijkingen

Kun je de vergelijkingen geven?

#10

jhnbk

    jhnbk


  • >5k berichten
  • 6905 berichten
  • VIP

Geplaatst op 03 maart 2009 - 11:38

Mogelijk kan nauwkeuriger maar trager werken door een decimal te gebruiken.
Het vel van de beer kunnen verkopen vraagt moeite tenzij deze dood voor je neervalt. Die kans is echter klein dus moeten we zelf moeite doen.

#11

thermo1945

    thermo1945


  • >1k berichten
  • 3112 berichten
  • Verbannen

Geplaatst op 03 maart 2009 - 14:39

Vaak werken afgeronde tussenafwoorden cumulatief door.

Veranderd door jhnbk, 03 maart 2009 - 15:24
3x dezelfde post geknipt.


#12

Vladimir Lenin

    Vladimir Lenin


  • >250 berichten
  • 829 berichten
  • Ervaren gebruiker

Geplaatst op 03 maart 2009 - 23:31

Tovarishch Lenin, wat betreft het leren van programmeren: ik stel steeds een doel waar ik naar toe werk, ik leer on the fly. Het is natuurlijk niet de juiste methode maar het werkt voor mij. Ik merk dat ik qua theorie nog wat tekortschiet, dat ben ik nu beetje bij beetje aan het oppakken.
Ik krab natuurlijk alleen nog maar het oppervlak op het moment, maar ik begin wel steeds vaker voor me te zien hoe ik iets kan oplossen in c#.

Wat betreft de juiste methode volgens mij bestaat er geen, zelf ben ik analoog begonnen, en gaandeweg de technologie vergroot, zoals DirectX, Eigen GUI,... volgens mij is het juist de manier om te leren programmeren, je stuit immers altijd weer op nieuwe problemen, waarop je een antwoord dient te zoeken. Ik denk dat een dergelijk methode juist één van de beste is.

Dit natuurlijk geheel terzijde van de topic.
"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."
--Vladimir Lenin-- (Владимир Ильич Ульянов)





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures