[Numpy-discussion] Problems testing the floating point flags

Mark Wiebe mwwiebe at gmail.com
Sun Nov 14 15:09:22 EST 2010


On Sun, Nov 14, 2010 at 7:07 AM, Charles R Harris <charlesr.harris at gmail.com
> wrote:

>
> Another possible solution is like so:
>
> static __attribute__ ((noinline)) int
> fpecheck(int *status)
> {
>     *status = PyUFunc_getfperr();
>     return 0;
> }
>
> static __attribute__ ((noinline)) int
> fpeclear(int *status)
> {
>     PyUFunc_clearfperr();
>     return 0;
> }
>
> int myfunc(void)
> {
>     int status;
>
>    fpeclear(&status);
>     do {
>         stuff;
>     } while (fpecheck(&status));
>     return status;
> }
>
>
While this may work in this particular case because of compiler specifics, I
don't think this creates a reliable ordering dependency because of the form
of 'stuff'. It will be loop invariant, so the compiler may do as follows:

    do {
        result = arg1 / arg2;
    } while (fpecheck(&status));

Pulling out the loop-invariant statement:

    result = arg1 / arg2;
    do {
    } while (fpecheck(&status));

Since the loop doesn't use result, it may feel free to reorder:

    do {
    } while (fpecheck(&status));
    result = arg1 / arg2;

producing the bug again.

-Mark
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20101114/d2baf649/attachment.html>


More information about the NumPy-Discussion mailing list