This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re-establish the fp overflow detection for VAX VMS; there
[perl5.git] / numeric.c
index 68c1671..c601943 100644 (file)
--- a/numeric.c
+++ b/numeric.c
@@ -572,6 +572,25 @@ 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
+     * overflowing doubles 'silently' as IEEE fp does.  Therefore we
+     * need to detect early whether we would overflow (this is
+     * the behaviour of the native string-to-float conversion routines,
+     * and therefore the behaviour of native applications, too.)
+     *
+     * [1] VAXC$EXTABLISH is the capability but it is basically a signal
+     * handler setup routine, and one cannot return from a fp exception
+     * handler and except much anything useful. */
+#if defined(VMS) && !defined(__IEEE_FP)
+#  if defined(__DECC_VER) && __DECC_VER <= 50390006
+    /* __F_FLT_MAX_10_EXP - 5 == 33 */
+    if (!negative &&
+          (log10(value) + exponent) >= (__F_FLT_MAX_10_EXP - 5))
+        return NV_MAX;
+#  endif
+#endif
     for (bit = 1; exponent; bit <<= 1) {
        if (exponent & bit) {
            exponent ^= bit;