-
Wurzel berechnen
Code:
void main(void) {
double x;
double wurzel;
printf("Bitte Zahl eingeben:\n>>");
scanf("%lf",&x);
wurzel=x/2;
while((wurzel*wurzel)!=x) {
if ((wurzel*wurzel)>x)
wurzel=wurzel-0.1;
if ((wurzel*wurzel)<x)
wurzel=wurzel+0.1;
}
Kann mir jemand sagen warum die while schleife nicht abgebrochen wird?
Fuer x gebe ich 9 ein.Dann muesste bei wurzel=3 abgebrochen werden oder?
-
Durch die beschränkte Auflösung bei Fließkomma Zahlen macht ein Vergleich auch Gleicheit oder Ungleicheit meistens keinen Sinn, weil der Wert eben nicht extakt sein muss.
Du kannst überprüfen, ob der Absolutbetrag der Differenz der beiden zu vergleichenden Zahlen kleiner als eine gewissen Schelle ist.
Also in etwa
Code:
if (fabs((wurzel*wurzel) - x) < 1e-10)
Übrigens muss es nach dem C Standard
heissen :)
Ciao,
_
-
hmm,
so hab ich das mal gemacht
Code:
#include <iostream>
using namespace std;
const double epsilon = 1e-5;
bool isEqual(double a, double b)
{
return abs(a - b) < epsilon;
}
double sqrt(double habenwill)
{
int counter = 0;
double spanne = habenwill;
double grenze = spanne/2;
double istes = spanne*spanne;
while (!isEqual(istes,habenwill))
{
if (istes < habenwill)
{
spanne = spanne + grenze;
}
else
{
spanne = spanne - grenze;
grenze /= 2;
}
counter++;
istes = spanne*spanne;
cout << spanne << " * " << spanne << " = " << istes << " " << counter << endl;
}
return spanne;
}
int main (void)
{
double suche;
cin >> suche;
cout << endl << sqrt(suche) << endl;
return 0;
}
wie schon gesagt wurde, Fliesskommazahlen musste auf eine bestimmte länge 'beschneiden' sonst funzt es nicht.