Mail Archives: djgpp/1993/05/07/16:02:23
Hi, again.
I tested with the short test*.c programs and I found that the defined constant
DBL_MAX made the trouble. Making the DBL_MAX constant smaller than the
value defined in <float.h>, the gcc hanging problem goes away and no problem
even for -O optimization.
This is very strange to me. I showed the fine-tuned DBL_MAX value in the
following sample program. This fine-tuned value may vary from system to
system, because various math-coprocessors exists and some people use
floating-point math emulation.
If this is related to floating point problem, why did only my system hang?
(since 486-25MHz is a common cpu/math unit.)
Any comments?
If I replace the fine tuned value into <float.h>, is there any possible
problems? (I don't care any small insignificant differences in output values.)
----- test3.c ----------------
#include <float.h>
#include <math.h>
#ifdef DBL_MAX
#undef DBL_MAX
#endif
/* #define DBL_MAX 1.7976931348623167e+308 quoted from <float.h> */
/* #define DBL_MAX 1.79769313486231577e+308 */ /* made gcc hang if >= */
#define DBL_MAX 1.79769313486231576e+308 /* gcc is okay with this */
double
test (double x, double y)
{
if (y == 0.) return (23.6);
if (x == 0.) return (DBL_MAX);
return (10.*log10(y / x));
}
--------
A small question: In this test3.c, y/x in log10() can possibly have big
number greater than DBL_MAX. What happen in such situation(big y and small x)?
y/x seems not just to be truncated to DBL_MAX in such cases before passing to
log10(). I got "Inf" instead of DBL_MAX value when I printed the log10(y/x)
value with "%g" format. (interesting. number becomes message string)
(BTW, changing to return(10.*(log10(y) - log10(x))); is a solution, but only
for log() function.)
Thanks.
Wonkoo.
- Raw text -