[Numpy-discussion] Zero Division not handled correctly?

David Cournapeau david at ar.media.kyoto-u.ac.jp
Mon Dec 7 01:18:52 EST 2009


Skipper Seabold wrote:
> I believe this is known, but I am surprised that division by "integer"
> zero results in the following.
>
> In [1]: import numpy as np
>
> In [2]: np.__version__
> Out[2]: '1.4.0.dev7539'
>
> In [3]: 0**-1 # or 0**-1/-1
> ---------------------------------------------------------------------------
> ZeroDivisionError                         Traceback (most recent call last)
>
> /home/skipper/school/Data/ascii/numpy/<ipython console> in <module>()
>
> ZeroDivisionError: 0.0 cannot be raised to a negative power
>
> In [4]: np.array([0.])**-1
> Out[4]: array([ Inf])
>
> In [5]: np.array([0.])**-1/-1
> Out[5]: array([-Inf])
>
> In [6]: np.array([0])**-1.
> Out[6]: array([ Inf])
>
> In [7]: np.array([0])**-1./-1
> Out[7]: array([-Inf])
>
> In [8]: np.array([0])**-1
> Out[8]: array([-9223372036854775808])
>
> In [9]: np.array([0])**-1/-1
> Floating point exception

np.array([0])**-1

This last one is sort of interesting - Skipper Seabold wrote:
> I believe this is known, but I am surprised that division by "integer"
> zero results in the following.
>
> In [1]: import numpy as np
>
> In [2]: np.__version__
> Out[2]: '1.4.0.dev7539'
>
> In [3]: 0**-1 # or 0**-1/-1
> ---------------------------------------------------------------------------
> ZeroDivisionError                         Traceback (most recent call last)
>
> /home/skipper/school/Data/ascii/numpy/<ipython console> in <module>()
>
> ZeroDivisionError: 0.0 cannot be raised to a negative power
>
> In [4]: np.array([0.])**-1
> Out[4]: array([ Inf])
>
> In [5]: np.array([0.])**-1/-1
> Out[5]: array([-Inf])
>
> In [6]: np.array([0])**-1.
> Out[6]: array([ Inf])
>
> In [7]: np.array([0])**-1./-1
> Out[7]: array([-Inf])
>
> In [8]: np.array([0])**-1
> Out[8]: array([-9223372036854775808])
>
> In [9]: np.array([0])**-1/-1
> Floating point exception

This last one is sort of interesting - np.array([0])**-1 returns the
smallest long, and on 2-complement machines, this means that its
opposite is not representable. IOW, it is not a divide by zero, but a
division overflow, which also generates a SIGFPE on x86. I think the
crash is the same as the one on this simple C program:

#include <stdio.h>

int main(void)
{
        long a = -2147483648;
        long b = -1;

        printf("%ld\n", a);
        a /= b;
        printf("%ld\n", a);

       return 0;
}

I am not sure about how to fix this: one simple way would be to detect
this case in the LONG_divide ufunc (and other concerned signed integer
types). Another, maybe better solution is to handle the signal, but
that's maybe much more work (I still don't know well how signals
interact with python interpreter).

cheers,

David




More information about the NumPy-Discussion mailing list