[Numpy-discussion] Crash on "import numpy" [including fix]

Thomas Schreiner tmp-numpy at tschreiner.org
Thu Sep 20 10:55:23 EDT 2007


Hi,

I just posted a mail via gmane - I didn't expect it to hit the list, so 
here's the full context:

Using NumPy in an embedded scenario sometimes leads to crashes (floating 
point exception) depending on the compiler used. If you compile your C++ 
application with some non-g++ compilers (e.g. Borland C++ Builder), it 
will crash as soon as you try to run "import numpy".

The reason is the way in which numpy initializes the double value for 
infinity in umathmodule.c:

static double
pinf_init(void)
{
     double mul = 1e10;
     double tmp = 0.0;
     double pinf;

     pinf = mul;
     for (;;) {
         pinf *= mul;
         if (pinf == tmp) break;
         tmp = pinf;
     }
     return pinf;
}

Whereas g++ compilers will interpret this intentional overflow as 
1.#INF, applications built with Borland C++ Builder will crash, throwing 
an overflow exception.

My proposal is to replace this method by creating the correct double 
value for infinity according to the IEEE 754 specification:

static double
pinf_init(void)
{
   char inf_string[9] = "\x00\x00\x00\x00\x00\x00\xF0\x7F";
   double pinf = ((double*)inf_string)[0];
   return pinf;
}

or, for big ending machines:
   char inf_string[9] = "\x7F\xF0\x00\x00\x00\x00\x00\x00";

This will always lead to the correct value for infinity, no matter what 
compiler is being used.

I already opened a ticket for this issue on
   http://scipy.org/scipy/numpy/ticket/582

Can you imagine incorporating this fix into trunk? I'm having some 
trouble recompiling numpy myself, so I would really appreciate this fix 
to be applied upstream so that the windows installer includes it.

Cheers,

Thomas

-- 
Thomas Schreiner, AGBS
Max Planck Institute for Biological Cybernetics
72076 Tuebingen / Germany
+49 7071 601 536



More information about the NumPy-Discussion mailing list