PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : double-Werte vergleichen in C


Gast
2004-01-30, 17:16:00
Hallo!

In meinem C-Programm muss ich zwei ziemlich kleine double-Werte vergleichen.

if ( merkmy!=(merkmy_letzt+MYINK) )

Das Problem ist, das die Werte immer als verschieden angesehen werden, selbst wenn sie eigentlich gleich sind.

merkmy könnte z.B. 0.000003 und merkmy_letzt 0.000002 sein. MYINK ist ein Makro und immer 0.000001. Mit diesen Werten wird die Bedingung als wahr interpretiert.

Wie kann man da was gegen machen?

Ich hab gesucht, ob es eine Standard-Funktion gibt, die die Werte auf z.B. sechs Nachkommastellen runden kann, aber keine gefunden. Ich weiß allerdings auch nicht, ob das helfen würde.

Danke im Vorraus,
Uli

Matrix316
2004-01-30, 17:24:20
Du nimmst jede Zahl mal 1000000 und dann ein Typecast zu int, typecast zu double und dann wieder durch 1000000 teilen. ;D

z.B.

int help=(int)0.0000005*1000000;
double help1=(double)help/1000000;

Sollte funktionieren bzw. kannst ja eine Funktion schreiben die das macht.

Gast
2004-01-30, 18:01:11
Nee, funktioniert leider nicht. Die Werte sind trotzdem ungleich.

Ich hab's auch ausprobiert mit Werte mal 1000000 nehmen und einer long unsigned zuweisen und dann diese Werte vergleichen.
Dabei fällt auf, dass 0.000001*1000000 nicht 1 ist (sondern 0).
0.000002*1000000 ist dann 1, 0.000003*1000000 ist 2 usw.
Allerdings auch das nicht zuverlässig! 0.000003*1000000 wurde zwischendurch auch mal (koreckterweise) als 3 berechnet.

Danke aber trotzdem für die Antwort!

Tom Servo
2004-01-30, 18:13:08
Weiss nicht ob ich das Problem richtig verstanden habe und habe eigentlich auch Null Ahnung von FP Zahlen. Vielleicht ginge folgendes (ungetestet):


#include <limits.h>
#include <float.h>
#include <math.h>

int
compare_double(double a, double b)
{
if (fabs(a-b) < DBL_EPSILON)
return 0;
else
return (a < b) ? -1 : 1;
}

int
eq_double(double a, double b)
{
return (fabs(a-b) < DBL_EPSILON);
}


edit: abs => fabs

ScottManDeath
2004-01-30, 18:16:34
const double epsilon = 0.0001;

if ( fabs ( wert_1 - wert2) < epsilon)
{
// gleich, bzw unterschiedlich bis auf epsilon
}
else
{
// ungleich
}



fabs berechnet den absoluten Betrag, ist wichtig, den es könnte ja sein das wert_1 < wert_2, dann kämen negative Werte raus....

Tom Servo
2004-01-30, 18:29:49
Gibt auch was dazu in einer C FAQ: http://www.eskimo.com/~scs/C-faq/q14.4.html

Gast
2004-01-30, 18:36:02
Jo super, damit kann ich weitermachen.

Vielen Dank an euch alle!

zeckensack
2004-01-30, 19:13:02
Das Epsilon oben ist eine maximal erlaubte absolute Abweichung. Es geht auch mit relativen Abweichungen (zB "1 Prozent").
bool equal(double a,double b)
{
static const double max_quotient=1.01; //TBD
if (a>=b)
{
return((b*max_quotient)>=a);
}
else
{
return((a*max_quotient)>=b);
}
}