X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=numeric.c;h=f12e9ba2d3c7353c0516063fef8b8f83ad62c034;hb=0af80b6034aad516a126a9414dadccac4de7f9dc;hp=c6019434850768b1b879083c3799119b0eddff8b;hpb=67597c89125e7e144f9ba60f5b1fe23b951286d8;p=p5sagit%2Fp5-mst-13.2.git diff --git a/numeric.c b/numeric.c index c601943..f12e9ba 100644 --- a/numeric.c +++ b/numeric.c @@ -572,6 +572,7 @@ S_mulexp10(NV value, I32 exponent) negative = 1; exponent = -exponent; } + /* Avoid %SYSTEM-F-FLTOVF_F sans VAXC$ESTABLISH. * In VAX VMS we by default use the D_FLOAT double format, * and that format does not have *easy* capabilities [1] for @@ -591,6 +592,20 @@ S_mulexp10(NV value, I32 exponent) return NV_MAX; # endif #endif + + /* In UNICOS and in certain Cray models (such as T90) there is no + * IEEE fp, and no way at all from C to catch fp overflows gracefully. + * There is something you can do if you are willing to use some + * inline assembler: the instruction is called DFI-- but that will + * disable *all* floating point interrupts, a little bit too large + * a hammer. Therefore we need to catch potential overflows before + * it's too late. */ +#if defined(_UNICOS) && defined(NV_MAX_10_EXP) + if (!negative && + (log10(value) + exponent) >= NV_MAX_10_EXP) + return NV_MAX; +#endif + for (bit = 1; exponent; bit <<= 1) { if (exponent & bit) { exponent ^= bit;