Hi All,

 

My problem is that I've noticed a strange behavior in Python while handling 
FPEs on Windows after switching compilers (msvc8 to msvc9) and I am trying to 
find out how Python handles INF values to figure out where the problem might 
be. 

 

The problem appeared when we noticed that behavior of Numeric (older version of 
NumPy) library has changed when dealing with Floating-Point Exceptions. We are 
building our own slightly modified version of Python in-house (including 
Numeric/NumPy) and when we switched from the msvc8 to msvc9 compiler, Numeric 
started to return '-inf' as a result of 'Numeric.log10(0.0)' instead of rasing 
an OverflowError. I know that Numeric is using umath instead of the math 
library and since math.log10(0.0) is still raising an Error (which is 
ValueError in 2.6 and OverflowError in 2.4, but still an error) I thought that 
it might have something to do with how umath or Numeric handles the input or 
return values of log functions.

 

Before hunting blindly I wanted to see how Python interprets INF results. I 
built a simple module with only one function that causes an FPE with log10(0.0) 
using C's math library and prints the results with printf. Then I imported that 
module from python, called the function and printed the result in python too to 
see if there are any differences between two values (which I found out that 
there are)

 

Here is the that part of the code from my C Python module:

 

static PyObject *badNum(PyObject *self, PyObject *args)

{

    int sts = 0; //Not used, just dummy

 

    double a = 0.0;

    double c = 0.0;

    

    if (!PyArg_ParseTuple(args, "i", &sts)) //Dummy check, no use

        return NULL;

    

    disableFPEs();

    c = log10(a); //Since FPEs disabled, should return '-1.#INF'

    enableFPEs();

 

    printf("C-Val: %f\n", c);

    

    return Py_BuildValue("d", c);

}

 

After I build the module and imported it into Python, I called the function and 
printed the return value in Python. The output was different in two versions of 
Python:

 

Output1 (Module was built with msvc8 and run by python24)

C-Val: -1.#INF

Py-Val: -1.#INF

 

Output2 (Module was built with msvc9 and run by python26)

C-Val: -1.#INF

Py-Val: -inf

 

I now know that compiler change didn't cause any change in return value of 
log10(0.0) at C level (both compilations resulted in '-1.#INF') so I am 
thinking that somehow at somewhere in Python core the value is translated into 
'-inf' and that might be the reason why Numeric/NumPy is missing the problem 
and having issues raising OverflowError like it's supposed to.

 

I started debugging Python.exe (with my module loaded) in Visual Studio. While 
tracing what's happening after the line "return Py_BuildValue("d", c);" I went 
down to the "floatobject.c " file (which I thought is highly relevant to 
floating-point value conversions) and in particular "format_float()" function 
but since I am not that familiar with Python internals, I am having trouble 
pinpointing the issue and the code where the "conversion" is happening and I 
can't even be sure if I am looking at the right place.

 

I would appreciate if someone could help me out or at least could point me to 
the right direction so that I can figure out the rest.

 

Thanks,

 

Best Regards,

 

Ali Erman CELEN

Platform Specialists / Porting

Dassault Systèmes I www.3ds.com <http://www.3ds.com/> 



This email and any attachments are intended solely for the use of the 
individual or entity to whom it is addressed and may be confidential and/or 
privileged.  If you are not one of the named recipients or have received this 
email in error, (i) you should not read, disclose, or copy it, (ii) please 
notify sender of your receipt by reply email and delete this email and all 
attachments, (iii) Dassault Systemes does not accept or assume any liability or 
responsibility for any use of or reliance on this email.For other languages, go 
to http://www.3ds.com/terms/email-disclaimer.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to