develooper Front page | perl.vmsperl | Postings from June 2002

Re: perl v5.8.0 17303 on VMS_VAX V7.2

From:
Hugo van der Sanden
Date:
June 20, 2002 06:49
Subject:
Re: perl v5.8.0 17303 on VMS_VAX V7.2
Message ID:
200206201351.g5KDpGI16736@crypt.compulink.co.uk
"Brian Tillman" <tillman@swdev.si.com> wrote:
:Final test failure summary.  The following tests failed:
[...]
:lib/Math/Trig........................FAILED at test 21
[...]
:Illegal division by zero at [-.lib.math]trig.t line 167.
:LIB/MATH/TRIG....FAILED at test 21
:
:I suspect this is also caused by the D_FLOAT problem, judging from the
:recent postings here.

Does your perl include my proposed patch for this? If not, it would be
useful if you could apply it and try running the tests again.

The copy below includes the additional fix from Craig.

Hugo
--- numeric.c.old	Sun Jun  9 18:55:23 2002
+++ numeric.c	Wed Jun 19 22:00:44 2002
@@ -727,10 +727,6 @@
 
     if (exponent == 0)
 	return value;
-    else if (exponent < 0) {
-	negative = 1;
-	exponent = -exponent;
-    }
 
     /* On OpenVMS VAX we by default use the D_FLOAT double format,
      * and that format does not have *easy* capabilities [1] for
@@ -743,11 +739,6 @@
      *
      * [1] Trying to establish a condition handler to trap floating point
      *     exceptions is not a good idea. */
-    /* UNICOS fp is similarly non-IEEE. */
-#if ((defined(VMS) && !defined(__IEEE_FP)) || defined(_UNICOS)) && defined(NV_MAX_10_EXP)
-    if ((log10(value) + exponent) >= (NV_MAX_10_EXP))
-        return negative ? 0.0 : NV_MAX;
-#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.
@@ -756,12 +747,28 @@
      * 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;
+
+#if ((defined(VMS) && !defined(__IEEE_FP)) || defined(_UNICOS)) && defined(NV_MAX_10_EXP)
+    STMT_START {
+	NV exp_v = log10(value);
+	if (exponent >= NV_MAX_10_EXP || exponent + exp_v >= NV_MAX_10_EXP)
+	    return NV_MAX;
+	if (exponent < 0) {
+	    if (-(exponent + exp_v) >= NV_MAX_10_EXP)
+		return 0.0;
+	    while (-exponent >= NV_MAX_10_EXP) {
+		/* combination does not overflow, but 10^(-exponent) does */
+		value /= 10;
+		++exponent;
+	    }
+	}
+    } STMT_END;
 #endif
 
+    if (exponent < 0) {
+	negative = 1;
+	exponent = -exponent;
+    }
     for (bit = 1; exponent; bit <<= 1) {
 	if (exponent & bit) {
 	    exponent ^= bit;



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About