Scripterklärung...
-
Ich habe mir folgenden Code zusammengebastelt(aus'm Internet, C-Buch MSDN usw.).
Er dient zur Wurzel berrechnung mithilfe des Heron Algorithmus.
Funzt auch soweit. Aber ich hab' keine Ahnung wie man so auf ein richtiges Ergebnis kommt.

Kann mir bitte mal jemand den Code erklären?double _sqrt(double a)
{
if(a<0)
{
return NAN;
}
else if(a==0)
{
return 0;
}
else if(a<1)
{
return 1/_sqrt(1/a);
}
else
{
return _sqrt(100u);
}
}double _sqrt(double a,double a0,double a1,unsigned n)
{
double tmp=(a1+a0)/2.0f;
if(n<=0)
{
return tmp;
}
if((tmptmp)<a)
{
a0=tmp;
}
else if((tmptmp)==a)
{
return tmp;
}
else
{
a1=tmp; }
return (a0==a1)?a0:_sqrt(a,a0,a1,--n);-----------------------------------------------------------------------------
-
Spendiert dem Herrn doch bitte ein paar cpp-Tags

double _sqrt(double a) { if(a<0) { return NAN; } else if(a==0) { return 0; } else if(a<1) { return 1/_sqrt(1/a); } else { return _sqrt(100u); } }Das ist eine "einfache Fallunterscheidung - und irgendwie glaube ich nicht, daß die so funktionieren kann. Für a>=1 führt das zu einer Endlosschleife (oder, wenn du ein _sqrt(unsigned int) überladen hast, zu einem falschen Ergebnis).
double _sqrt(double a,double a0,double a1,unsigned n) { double tmp=(a1+a0)/2.0f; if(n<=0) { return tmp; } if((tmp*tmp)<a) { a0=tmp; } else if((tmp*tmp)==a) { return tmp; } else { a1=tmp; } return (a0==a1)?a0:_sqrt(a,a0,a1,--n); }Wurzelberechnung durch eine Reihenentwicklung - schau mal in deinem Lieblings-Mathebuch nach, wie das gehen soll.
(btw hätte ich dafür eher eine Schleife verwendet als einen rekursiven Aufruf)
-
der code ist zu kompliziert. mach erstmal den code so einfach wie möglich und wenn er geht, mach ihn wieder kompliziert, aber immer mit nachgucken, ob's noch geht.
double sqrt(double a){ assert(a>=1);//für die zauberhafte bedingung double x=a;//ich fange zu weit rechts an double n; do{ n=(x+a/x)/2;//n ist bessere näherung, aber auch zu weit rechts //sieht man deutlich, wenn man heron als sonderfal von newton //betrachtet und guckt, wo die tangente die x-achse schneidet //mit der parabel f(x)=x^2-a }while(n<x);//ändert sich erst, wenn maschinengenauigkeit erreicht return n; }