Re: Almost succesfull build on AIX

About this list Date view Thread view Subject view Author view Other groups

Subject: Re: Almost succesfull build on AIX
From: Martin Maechler (maechler@stat.math.ethz.ch)
Date: Thu 08 Jul 1999 - 18:24:15 EST


Message-Id: <199907080824.KAA26378@sophie.ethz.ch>

>>>>> Peter Dalgaard BSA <p.dalgaard@biostat.ku.dk> writes:

PD> Thomas Vogels <tov@infiniti.ece.cmu.edu> writes:
>> "Kurt" == Kurt Hornik <Kurt.Hornik@ci.tuwien.ac.at> writes:

> >> Here's the problem:
> >>> 1/0
> >> [1]INF
> >>> is.finite(1/0)
> >> [1] TRUE

>> Much to my surprise, a 'printf ("%g", 1/.0)' prints INF in a C
>> program. Should this not result in a floating point exception?

PD> Not according to IEEE specs (but integer divide by zero is
PD> generally unmaskable). The interesting thing is that is.finite
PD> returns TRUE on the result, and the printing also suggests that the
PD> infinite value is not recognised internally (if it were, it would
PD> get printed as
>> 1/0
PD> [1] Inf )

PD> It would be nice to see the actual bit pattern of 1/.0. Could one
PD> of you do something like

PD> x = 1/.0; printf("%0x,%0x\n", ((int *) &x)[0], ((int *) &x)[1]);

PD> or whatever other obfuscation works on AIX...

I've done more than Peter requested;
namely, the "finite" probing has always been a big problem on AIX,
and I rediscovered my old testing code -- which I enhanced with Peter's HEX
dump proposal:
  [everything in ftp://stat.ethz.ch/U/maechler/R/AIX-finite-tst.tar.gz !]

    #include <stdio.h>
    #include <math.h>

    #ifdef AIX
    # include <fp.h>
    #endif

    main() {
      double x,x2,x3;
      printf("finite(1.0)= %d (=1, hopefully)\n", finite(1.0));
      x=1./0.; x2= (-1.)/0.; x3 = 0./0.;
      printf("Inf := 1/0 = %f;\t -Inf := -1/0 = %f;\t NaN:= 0/0 = %f\n",x, x2, x3);
      printf("finite(x), f.(x2), f.(x3): %d %d %d (should all be 0)\n",
             finite(x),finite(x2),finite(x3));
      printf("Now the `bits':\n");
      printf(" Inf : %0x,%0x\n", ((int *) &x )[0], ((int *) &x )[1]);
      printf("-Inf : %0x,%0x\n", ((int *) &x2)[0], ((int *) &x2)[1]);
      printf(" NaN : %0x,%0x\n", ((int *) &x3)[0], ((int *) &x3)[1]);

    #ifdef AIX
      printf("FINITE(x), f.(x2), f.(x3): %d %d %d (should all be 0)\n",
             FINITE(x),FINITE(x2),FINITE(x3));
    #endif
    }

------------
And I have this in my Makefile [also available on Web, s.above]

    ## on AIX (percol)
    #CFLAGS = -D_XOPEN_SOURCE -DAIX
    # better for R (defines cosh(.) AND fd_set(.) (sys/time.h):
    CFLAGS = -D_XOPEN_SOURCE_EXTENDED=1 -DAIX

My Conclusions:

  - Only if I use these CFLAGS does finite work properly.
  - The bit pattern are compiler-independent for +-Inf, but NOT for NaN :

Here is gcc [with above CFLAGS], gcc version 2.7.2.3, output:
----------------------------------
finite(1.0)= 1 (=1, hopefully)
Inf := 1/0 = INF; -Inf := -1/0 = -INF; NaN:= 0/0 = NaNQ
finite(x), f.(x2), f.(x3): 0 0 0 (should all be 0)
Now the `bits':
 Inf : 7ff00000,0
-Inf : fff00000,0
 NaN : 7fffffff,ffffffff
FINITE(x), f.(x2), f.(x3): 0 0 0 (should all be 0)
----------------------------------

xlc (the native AIX C compiler) gives the same BUT for the NaN bit pattern
where it has

 NaN : 7ff80000,0

------------------------

Martin Maechler <maechler@stat.math.ethz.ch> http://stat.ethz.ch/~maechler/
Seminar fuer Statistik, ETH-Zentrum SOL G1; Sonneggstr.33
ETH (Federal Inst. Technology) 8092 Zurich SWITZERLAND
phone: x-41-1-632-3408 fax: ...-1086 <><
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


About this list Date view Thread view Subject view Author view Other groups

This archive was generated by hypermail 2b25 : Tue 04 Jan 2000 - 14:16:05 EST