Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C - Iterationsgrenze
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule C - Iterationsgrenze
JamesNguyen
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2021-02-28


Hallo,

da das wichtig ist nochmal extra

wie kann ich eine sinnvolle untergrenze für

fabs ( xNplus1 - xN ) > rad * 1e-14

festlegen? (also für rad * 1e-14 )


  1. double quwl ( double rad )
  2. {
  3. if ( rad < 0 ) return - 1 ;
  4.  
  5. auto double xN = 1 ;
  6.  
  7. if ( xN < sqrt ( DBL_MIN ) ||
  8. xN > sqrt ( DBL_MAX ) ||
  9. rad > DBL_MAX - xN * xN ) return - 1 ;
  10.  
  11. auto double xNplus1 = 1 / ( 2 * xN ) * ( xN * xN + rad ) ;
  12.  
  13. while ( fabs ( xNplus1 - xN ) > rad * 1e-14 &&
  14. xNplus1 > sqrt ( DBL_MIN ) - 1 &&
  15. xNplus1 < sqrt ( DBL_MAX ) + 1 &&
  16. rad < DBL_MAX - xNplus1 * xNplus1 + 1 )
  17. {
  18. xN = xNplus1 ;
  19.  
  20. xNplus1 = 1 / ( 2 * xN ) * ( xN * xN + rad ) ;
  21. }
  22.  
  23. return xNplus1 ;
  24. }



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2785
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2021-02-28


Wie wäre es, wenn du nach jeder Iteration schaust, ob sich die Lösung verbessert hat?


Ansonsten stellt sich natürlich die Frage, warum man das Ganze eigentlich so detailliert implementieren will und dann trotzdem ein naives Heronverfahren nutzt, statt sich die Tatsache zunutze zu machen, dass man eine Fließkommazahl vorliegen hat.


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2021-03-01


Vielen Dank für den guten Vorschlag.

Was meinst du aber damit dass man sich zunutze machen
kann dass es sich um eine FLießkommazahl vorliegen hat?



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, vom Themenstarter, eingetragen 2021-03-01


Hallo,

ich habe mal auch eine mathematische Frage dazu gestellt

-> LinkHeron-Verfahren



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2021-03-01


ich habe das jetzt so in der while bedingung

  1. while ( fabs ( xNplus1 - sqrt ( rad ) ) < fabs ( xN - sqrt ( rad ) ) &&
  2. xNplus1 >= sqrt ( DBL_MIN ) &&
  3. xNplus1 <= sqrt ( DBL_MAX ) &&
  4. rad <= DBL_MAX - xNplus1 * xNplus1 )
  5. {
  6. xN = xNplus1 ;
  7.  
  8. xNplus1 = 1 / ( 2 * xN ) * ( xN * xN + rad ) ;
  9. }
  10.  
  11. return xN ;

gebe also xN und nicht xNplus1 zurück


zu Bedingung

angenommen

ich iteriere also

und

es kommt soll 5 am ende rauskommen

dann itereriert er


24 -> 15 -> 9 -> 6 -> 4

und dann bricht er ab (hier wird die annahme getroffen der wert kann auch 'auf die andere seite von 5 das wäre also nicht mehr streng monoton)

so

jetzt also betrag ( 6 - 5 ) = 1
betrag ( 4 -5 ) = 1

er bricht also ab

in meinem programm

würde er die 6 also xN

zurückgeben

und nicht 4 was xNplus1.

welche der beiden werte ist der richtige?

bzw. allgemeiner ist der wert richtiger dessen letzte nachkommastelle mit der richtigen zahl übereinstimmt oder
der wert dessen letzte nachkommastelle(n) vlt nicht übereinstimmen aber der wert liegt näher am richtigen wert?



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, vom Themenstarter, eingetragen 2021-03-01


wenn ich nun xNplus1 ausgebe

also

den letzten wert von

1.41421356237309510000
1.41421356237309490000

web2.0 rechnre liefert

1.414213562373095

hier wären beide werte gleich gut aber man würde sehen dass der die iteration von den richtigen wert von unterschreitet hat


wolfram alpha liefert

1.41421356237309504....

hier wäre also der obere wert richtiger

könnte man das allgemein sagen und ich nehme lieber

xN also den oberen werte

und macht dann < statt <= in der bedingung?



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2021-03-01


ok also ich habe mir gedacht

ich hab ja die bedingung mit <

dass heißt er hört auf

sobald der der abstand zum richtigen wert > oder = ist

ich würde sagen

in beiden fällen (> offensichtlich) ist falls der richtige wert sogar weitere nachkommstellen

dem xN näher als dem xNplus1

also xN der allgemein richtigere wert.

falls der richtige wert keine weiter nachkommastellen hat

ist bei gleichheit

xN und xNplus1 gleich gut

ne das ist alles falsch


wenn ich mich von unten dem richtigen wert nähere

dann ist xNplus1 der bessere Wert

wie kann ich also entscheiden?



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, vom Themenstarter, eingetragen 2021-03-01


Meine aktuelle Version

aber die Startwerte von mir liefern immer noch schlechtere Ergebenisse als x0 = 1

  1. double quwl ( double rad )
  2. {
  3. if ( rad < 0 ) return - 1 ;
  4.  
  5. auto double xN = rad > 2 ? log ( rad ) / log ( 2 ) :
  6. rad > 0.5 ? rad / 2 :
  7. rad > - 1 ? rad * 2 : - 1 ;
  8.  
  9. if ( xN < sqrt ( DBL_MIN ) ||
  10. xN > sqrt ( DBL_MAX ) ||
  11. rad > DBL_MAX - xN * xN ) return - 1 ;
  12.  
  13. auto double xNplus1 = 1 / ( 2 * xN ) * ( xN * xN + rad ) ;
  14.  
  15. while ( xNplus1 >= sqrt ( DBL_MIN ) &&
  16. xNplus1 <= sqrt ( DBL_MAX ) &&
  17. rad <= DBL_MAX - xNplus1 * xNplus1 )
  18. {
  19. if ( fabs ( xNplus1 - sqrt ( rad ) ) > fabs ( xN - sqrt ( rad ) ) )
  20. return xN ;
  21.  
  22. if ( fabs ( xNplus1 - sqrt ( rad ) ) == fabs ( xN - sqrt ( rad ) ) )
  23. return xNplus1 > xN ? xNplus1 : xN ;
  24.  
  25. xN = xNplus1 ;
  26.  
  27. xNplus1 = 1 / ( 2 * xN ) * ( xN * xN + rad ) ;
  28. }
  29.  
  30. return xNplus1 ;
  31. }



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2785
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, eingetragen 2021-03-01


2021-03-01 00:31 - JamesNguyen in Beitrag No. 2 schreibt:
Vielen Dank für den guten Vorschlag.

Was meinst du aber damit dass man sich zunutze machen
kann dass es sich um eine FLießkommazahl vorliegen hat?


Die Wurzel einer Fließkommazahl mit geradem Exponenten ist gleich der Wurzel aus der Mantisse mit halbem Exponenten.

Der eigentlich Wurzelalgorithmus muss daher nur den (um eine Potenz erweiterten) Bereich der Mantisse abdecken.

Diesen sehr kleinen Bereich (binär dann bspw. $[1;4)$, dezimal $[1;100)$) kann man dann mit Heron, Taylorreihe oder Interpolationspolynomen beliebig genau abdecken.


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen hat die Antworten auf ihre/seine Frage gesehen.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]