Autor |
C - Gleitkomma Genauigkeit 2 |
|
JamesNguyen
Aktiv  Dabei seit: 08.11.2020 Mitteilungen: 187
 |
Hallo nochmal,
ok ich habe glaube ich die ganze Zeit Blödsinn erzählt
Hier jetzt meine neue Funktion für Quadratwurzel
double quwl ( double rad )
{
auto double xN = 1 , xNplus1 = 1 / ( 2 * xN ) * ( xN * xN + rad ) ;
auto unsigned char i ;
while ( xN != xNplus1 )
{
xN = xNplus1 ;
xNplus1 = 1 / ( 2 * xN ) * ( xN * xN + rad ) ;
}
return xNplus1 ;
}
|
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
|
Notiz Profil
Quote
Link |
JamesNguyen
Aktiv  Dabei seit: 08.11.2020 Mitteilungen: 187
 |     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?
|
Notiz Profil
Quote
Link |
JamesNguyen
Aktiv  Dabei seit: 08.11.2020 Mitteilungen: 187
 |     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
|
Notiz Profil
Quote
Link |
JamesNguyen
Aktiv  Dabei seit: 08.11.2020 Mitteilungen: 187
 |     Beitrag No.3, vom Themenstarter, eingetragen 2021-02-28
|
Ich habe nun meine FUnktion angepasst und sie bricht jetzt auch immer ab denke ich
double quwl ( double rad )
{
if ( rad < 0 ) return - 1 ;
auto double xN = 1 ;
if ( xN < sqrt ( DBL_MIN ) ||
xN > sqrt ( DBL_MAX ) ||
rad > DBL_MAX - xN * xN ) return - 1 ;
auto double xNplus1 = 1 / ( 2 * xN ) * ( xN * xN + rad ) ;
while ( fabs ( xNplus1 - xN ) > rad * 1e-14 &&
xNplus1 > sqrt ( DBL_MIN ) - 1 &&
xNplus1 < sqrt ( DBL_MAX ) + 1 &&
rad < DBL_MAX - xNplus1 * xNplus1 + 1 )
{
xN = xNplus1 ;
xNplus1 = 1 / ( 2 * xN ) * ( xN * xN + rad ) ;
}
return xNplus1 ;
}
|
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
|
Notiz Profil
Quote
Link |
DerEinfaeltige
Senior  Dabei seit: 11.02.2015 Mitteilungen: 2763
 |     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 -
|
Notiz Profil
Quote
Link |
JamesNguyen
Aktiv  Dabei seit: 08.11.2020 Mitteilungen: 187
 |     Beitrag No.5, vom Themenstarter, eingetragen 2021-02-28
|
ok update mit makros sieeh code oben
|
Notiz Profil
Quote
Link |
JamesNguyen
Aktiv  Dabei seit: 08.11.2020 Mitteilungen: 187
 |     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
|
Notiz Profil
Quote
Link |
JamesNguyen
Aktiv  Dabei seit: 08.11.2020 Mitteilungen: 187
 |     Beitrag No.7, vom Themenstarter, eingetragen 2021-02-28
|
Der Wert 0
liefert
-1.#IND00
?
|
Notiz Profil
Quote
Link |