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


Hallo nochmal,

ok ich habe glaube ich die ganze Zeit Blödsinn erzählt
Hier jetzt meine neue Funktion für Quadratwurzel

  1. double quwl ( double rad )
  2. {
  3. auto double xN = 1 , xNplus1 = 1 / ( 2 * xN ) * ( xN * xN + rad ) ;
  4.  
  5. auto unsigned char i ;
  6.  
  7. while ( xN != xNplus1 )
  8. {
  9. xN = xNplus1 ;
  10. xNplus1 = 1 / ( 2 * xN ) * ( xN * xN + rad ) ;
  11. }
  12.  
  13. return xNplus1 ;
  14. }


Ich kenne das Problem bspw. wenn ein System nur 6 sign stellen unterscheiden könnte

dann wären 1234.2399 = 1234.23  gleich

*heißt das hier eig dass der COmpiler die Zahl links beim vergleich nicht auf 1234.24 aufrundet sonder einfach hinter der 6. stelle abschneidet?

Jedenfalls gibt es bzgl dieses WIssens Probleme mit der FUnktion?
Ich sehe gerade keine

Danke,
James



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


ok ich habe gemerkt bei quwl( 3 ) beendet das Programm nicht ich glaube mal die xN gleichen sich hier nie..

Wie kann das beheben?



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


1.75000000000000000000
1.73214285714285700000
1.73205081001472760000
1.73205080756887740000
1.73205080756887720000
1.73205080756887760000
1.73205080756887740000
1.73205080756887720000
1.73205080756887760000
1.73205080756887740000
1.73205080756887720000
1.73205080756887760000
1.73205080756887740000
1.73205080756887720000
1.73205080756887760000
1.73205080756887740000
1.73205080756887720000
1.73205080756887760000
1.73205080756887740000



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


Ich habe nun meine FUnktion angepasst und sie bricht jetzt auch immer ab denke ich

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


aber kann mir jemand insbesondere in Verbindung mit der Genauigkeit von double erklären warum es funktioniert?

Auch habe ich gemerkt das ich die erste Bedingung in der while-Bedingung nicht unbedingt brauche

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

also die Gleichheit. warum?

Danke,
James



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: 2754
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, eingetragen 2021-02-28


Deine if-Abfrage in Zeile 7 ist sinnlos.

Vermutlich möchtest du "logisch oder" (||) schreiben statt "logisch und" (&&).

Und auf Gleichheit $x_{n+1}=x_n$ muss man natürlich nicht testen, wenn bereits die wesentlich stärkere Bedingung $|x_{n+1}-x_n|>\epsilon$ erfüllt ist.


-----------------
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 Monat
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, vom Themenstarter, eingetragen 2021-02-28


ok update mit makros sieeh code oben



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


ist diese epsilon eig das richtige?

wenn ja wieso?

lässt sich das mit der genauigkeit von double begründen?

ich habe das durch ausprobieren von sehr wenigen werten so gefunden

weiß nicht ob das für alle werte so ist

ich habe halt gemerkt

das ein paar werte bei

der != bedingung nicht die Iteration abbrechen und sie ewig weiterläuft



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


Der Wert 0

liefert

-1.#IND00

?



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]