floating point underflow; exception on attempt to print value less than DBL_MIN

Loren James Rittle rittle@latour.rsch.comm.mot.com
Fri Mar 22 18:07:00 GMT 2002


In article <87y9gkqb44.fsf@creche.redhat.com>,
Tom Tromey <tromey@redhat.com> writes:

> I assume that DBL_MIN is the minimum normal number, and the Java
> Double.MIN_VALUE is denormalized.

OK.  I know the terms but should the libc routine always be able to
print the denormalized values?  I now question my earlier thought that
it was an underflow problem.

Loren> Given that a value smaller than DBL_MIN is appearing makes me
Loren> question that something else is wrong with this port
Loren> configuration.

> Not necessarily.

OK.

Loren> What sort of patch would be accepted, if any?  While sorting
Loren> out C++ library issues, I have noticed that this ieee math
Loren> implementation appears to be configured differently than most
Loren> other platforms by default.  In conjunction with the exception
Loren> on overflow/underflow, we see the additional complications.

> It sounds like libgcj might see these floating point exceptions at
> runtime, which we definitely don't want.  Is there something we can
> call at runtime to tell the system not to generate these?

> If there is, then libgcj ought to call it.  So should gcjh.
> This will no doubt require configure hacking.

> If you can find such a call, modify your test program to use it and
> then see what happens.

> Failing that, I suppose we could link gcjh against something like
> fdlibm.  That might be painful.  And it won't solve potential problems
> in libgcj.

OK, I will try this and report back (on Monday).

> If you have other ideas, feel free...

I will need to look at exactly why the libc routine is raising an
exception (unfortunately, I don't have libc built for debugging on
these alpha machines at the moment).  I might have found a real OS
bug.

Does the output of this program:

#include <float.h>
main() {
  double d = DBL_MIN;
  printf (" = %.17g;\n", d);
  printf (" = %.17g;\n", d/10);
  printf (" = %.17g;\n", (DBL_MIN/10)*10);
  printf (" = %.17g;\n", (DBL_MIN/10));
}

S rittle@clerc-milon; a.out
 = 2.2250738585072014e-308;
 = 0;
 = 2.2250738585072034e-308;
floating point exception--core dumped

make any sense?  Not to me.



More information about the Java mailing list