double Type
-
Hallo,
ich hoffe das mir hier jemand weiter helfen kann:
ja, ich habe eine Schleife:
while(i!=1000){ erg=a*b+c*d; i++;}
alle Variablen sind von Type double.
a,b,c,d können verschiedene Werte annehmen, auch negativ.
Falls es einen überlauf oder unterlauf geben sollte, so soll erg maximalen bzw. minimalen double Wert annehmen.Wie löse ich die Aufgabe am einfachsten? Ich arbeite auf OS9 System.
MfG,
PS: das Board wurde mir von www.diabolo666-board.com empfolen
-
while (i < 1000)
du kannst gleitkommazahlen nicht mit == vergleichen und erwarten, dass etwas intelligentes rauskommt.
fuer laufvariablen nimmt man ganzzahlen, also tue du das bitte auch.
-
c.rackwitz schrieb:
while (i < 1000)
du kannst gleitkommazahlen nicht mit == vergleichen und erwarten, dass etwas intelligentes rauskommt.
fuer laufvariablen nimmt man ganzzahlen, also tue du das bitte auch.Sorry,
habe vergessen zu schreiben, das i von Type int ist. ich dachte aber dass es sowieso allen klar ist.
Nur die Variablen a,b,c,d, erg sind von Type double.
mfg,
-
dein problem ist absolut unklar, dein code ist zu wenig.
lies das und mach mich gluecklich
http://www.c-plusplus.net/forum/viewtopic-var-t-is-136013.html
-
ok, ich versuche es noch einmal
ich will meinen C-Code gegen Überlauf der double-variablen "erg" absichern.
Das C-Code was ich im meinem ersten Beitrag geschrieben habe, ist nur ein Beispielscode. Mein orig. Code funktioniert auf die gleiche Weise, ich habe es nur stark vereinfacht.Mein Ziel:
ich will wissen, wie ich einen Überlauf, bei einer double-variablen feststellen kann. So viel ich weis, wird beim Überlauf einer double-variablen ein +/-unendlicher Wert zugewiesen.
Wie merkt es mein Programm? (was versteht Compiler unter +/-infinity)
Wurde ein Überlauf festgestellt, so soll es nicht zu einer Fehlermeldung kommen. Der Variablen "erg", wird dann maximaler bzw. minimaler Double-Wert
zugewiesen.if(+unendlich) // +unendlich muss ersetzt werden :confused: { erg=DBL_MAX;} if(-unendlich) //-unendlich muss ersetzt werden :confused: {erg=DBL_MIN;}
Ich hoffe, dass es jetzt einiger maßen verständlich dargestellt wurde.
MfG,
-
C99 weiss um infinities.
lies dich am besten mal da ein:
http://www.dinkumware.com/manuals/reader.aspx?lib=cl&h=math.html#INFINITY
-
Ist aber mehr oder weniger geraten und geht natürlich nur unter MSVC (und villeicht noch anderen komerzillen Compilern, weil GCC wegen dem Patent kein SEH hat.[/quote]
GCC???
SEH???Danke für den Vorschlag, ich werde es Morgen in der Arbeit ausprobieren.
Ich habe kein OS9-System zuhause.In welcher header-datei können EXCEPTION_FLT_UNDERFLOW und EXCEPTION_FLT_OVERFLOW stehen. Und können diese auch ander heißen?
MfG,
-
c.rackwitz schrieb:
C99 weiss um infinities.
lies dich am besten mal da ein:
http://www.dinkumware.com/manuals/reader.aspx?lib=cl&h=math.html#INFINITYAuf der Seite war ich schon. Ich weiss aber immer noch nicht auf was ich "erg" abfragen soll.
Warum wurde gerade eben ein Beitrag gelöscht? war das der Autor oder Moderator?????
-
if (isinf(erg)) erg = foobar;
-
c.rackwitz schrieb:
if (isinf(erg)) erg = foobar;
Danke, ich werde morgen berichten, ob es geklappt hat!
-
Hallo,
ich habe kein isinf. Hast du anderen Vorschlag?
mein math.h
#ifndef _MATH_H_INCLUDED #define _MATH_H_INCLUDED #ifndef HUGE_VAL #define HUGE_VAL (*HUGE_dll) extern double *HUGE_dll; #endif /* ! defined (HUGE_VAL) */ /* Reentrant ANSI C functions. */ extern double atan(double); extern double cos(double); extern double sin(double); extern double tan(double); extern double tanh(double); extern double frexp(double, int *); extern double modf(double, double *); extern double ceil(double); extern double fabs(double); extern double floor(double); extern double acos (double); extern double asin (double); extern double atan2 (double, double); extern double cosh (double); extern double sinh (double); extern double exp(double); extern double ldexp(double, int); extern double log(double); extern double log10(double); extern double pow(double, double); extern double sqrt(double); extern double fmod(double, double); /* Non ANSI double precision functions. */ extern double infinity(void); extern int isnan (double); extern int finite (double); extern double copysign(double, double); extern double asinh (double); extern double nextafter (double, double); extern double acosh (double); extern double atanh(double); extern double lgamma (double); extern double y0 (double); extern double y1 (double); extern double yn(int, double); extern double j0(double); extern double j1 (double); extern double jn (int, double); #define log2(x) (log (x) / M_LOG2_E) extern double hypot (double, double); #define _hypot hypot extern double cabs(struct complex); /* The exception structure passed to the matherr routine. */ struct exception { int type; char *name; double arg1; double arg2; double retval; int err; }; extern int matherr (struct exception *e); /* Values for the type field of struct exception. */ #define DOMAIN 1 #define SING 2 #define OVERFLOW 3 #define UNDERFLOW 4 #define TLOSS 5 #define PLOSS 6 /* Useful constants. */ #define M_E 2.7182818284590452354 #define M_LOG2E 1.4426950408889634074 #define M_LOG10E 0.43429448190325182765 #define M_LN2 0.69314718055994530942 #define M_LN10 2.30258509299404568402 #define M_PI 3.14159265358979323846 #define M_TWOPI (M_PI * 2.0) #define M_PI_2 1.57079632679489661923 #define M_PI_4 0.78539816339744830962 #define M_3PI_4 2.3561944901923448370E0 #define M_SQRTPI 1.77245385090551602792981 #define M_1_PI 0.31830988618379067154 #define M_2_PI 0.63661977236758134308 #define M_2_SQRTPI 1.12837916709551257390 #define M_SQRT2 1.41421356237309504880 #define M_SQRT1_2 0.70710678118654752440 #define M_LN2LO 1.9082149292705877000E-10 #define M_LN2HI 6.9314718036912381649E-1 #define M_SQRT3 1.73205080756887719000 #define M_IVLN10 0.43429448190325182765 /* 1 / log(10) */ #define M_LOG2_E 0.693147180559945309417 #define M_INVLN2 1.4426950408889633870E0 /* 1 / log(2) */ #endif /* _MATH_H_ */
-
Bond schrieb:
Hallo,
ich habe kein isinf. Hast du anderen Vorschlag?
mein math.h
extern int finite (double);
Diese Funktion könnte etwas bringen
finite() returns the value 1 just when -Infinity < x < +Infinity; otherwise a zero is returned (when |x| = Infinity or x is NaN.
-
Habe jetzt so gelöst:
if(erg > DBL_MAX) erg=DBL_MAX; if(erg < DBL_MIN) erg=DBL_MIN;
was haltet ihr davon?
-
Eine frage habe ich noch:
Das double-bereich zieht sich von -….. bis +….. (maschinen abhängig)
Wo finde ich diese Angaben?
In meinem float.h stehen nur positive Werte.
Wenn ich aber unendliche Schleife erstelle, so werden auch negative Double-Werte angezeigt
SCHLEIFE:while(1!=0) { printf("inf_min ist %f\n",i); i=-i*9999999999*9999999999*999999999*99999999; }
FLOAT.H
#if !defined(_FLOAT_H) #define _FLOAT_H #define FLT_RADIX 2 #if defined(_FPF387) #define FLT_ROUNDS 0 #endif #if defined(_FPF881) || defined(_FPFPOWERPC) || defined(_FPFCMX) || defined(_FPFMIPS) || defined(_FPFARM) || defined(_FPFSPARC) || defined(_FPFSH) || defined(_FPFSH4) || defined(_FPFSH5M) #define FLT_ROUNDS 1 #endif #define FLT_MANT_DIG 24 #define FLT_EPSILON 1.119209290e-07f #define FLT_DIG 6 #define FLT_MIN_EXP -125 #define FLT_MIN 1.17549435e-38f #define FLT_MIN_10_EXP -37 #define FLT_MAX_EXP 128 #define FLT_MAX 3.40282346e+38f #define FLT_MAX_10_EXP 38 #define DBL_MANT_DIG 53 #define DBL_EPSILON 2.2204460492503131e-16 #define DBL_DIG 15 #define DBL_MIN_EXP -1021 #define DBL_MIN 2.2250738585072016e-308 #define DBL_MIN_10_EXP -307 #define DBL_MAX_EXP 1024 #define DBL_MAX 1.7976931348623156e308 #define DBL_MAX_10_EXP 308 #define LDBL_MANT_DIG 53 #define LDBL_EPSILON 2.2204460492503131e-16 #define LDBL_DIG 15 #define LDBL_MIN_EXP -1021 #define LDBL_MIN 2.2250738585072016e-308 #define LDBL_MIN_10_EXP -307 #define LDBL_MAX_EXP 1024 #define LDBL_MAX 1.7976931348623156e308 #define LDBL_MAX_10_EXP 308 /* Extensions */ #define _DBL_MAX_FRAC .17976931348623157 #define _DBL_MIN_FRAC .22250738585072016 #define _DBL_EXP_BIAS 1023 #define _DBL_MAX_BIAS_EXP 2047 #endif /* _FLOAT_H */
MfG,
-
Bond schrieb:
In meinem float.h stehen nur positive Werte.
Die Minima sind betragsmäßig gleich den Maxima, nur das Vorzeichen ist umgedreht.
-
Bashar schrieb:
Bond schrieb:
In meinem float.h stehen nur positive Werte.
Die Minima sind betragsmäßig gleich den Maxima, nur das Vorzeichen ist umgedreht.
Für was steht dann DBL_MIN???
-
fuer eine sehr kleine zahl, also etwas nahe an null?
-
Ja klar, das sehe ich auch. Aber warum heißt es dann DBL_MIN.
Steht es nicht für min.double????
Und ist DBL_MAX nicht max.Double???
-
Bond schrieb:
Ja klar, das sehe ich auch. Aber warum heißt es dann DBL_MIN.
Steht es nicht für min.double????
Und ist DBL_MAX nicht max.Double???min.double und max.double sind keine korrekten C-Identifier, deswegen die Namenswahl DBL_MIN (kleinste positive double-Zahl) bzw. DBL_MAX.
PS: Unter C++ ist das etwas klarer, dort heißt das "numeric_limits<double>::min" bzw. "numeric_limits<double>::max"