Archiv verlassen und diese Seite im Standarddesign anzeigen : Wurzel berechnen
sven1978
15-02-2003, 09:13
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?
anda_skoa
15-02-2003, 12:57
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
if (fabs((wurzel*wurzel) - x) < 1e-10)
Übrigens muss es nach dem C Standard
int main(void)
heissen :)
Ciao,
_
so hab ich das mal gemacht
#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.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.