From 67597c89125e7e144f9ba60f5b1fe23b951286d8 Mon Sep 17 00:00:00 2001
From: Jarkko Hietaniemi
Date: Wed, 15 Aug 2001 12:48:32 +0000
Subject: [PATCH] Re-establish the fp overflow detection for VAX VMS; there is
no easy way to have the IEEE fp silent overflow semantics. (in Alpha VMS we
still will use IEEE fp by default-- but it is still possible to configure
Perl to use G_FLOAT)
p4raw-id: //depot/perl@11679
---
numeric.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/numeric.c b/numeric.c
index 68c1671..c601943 100644
--- 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;
--
1.8.3.1