0

I've a very basic issue.

import numpy as np

def u(x):
    return 1 - x + x**2 - x**3 + x**4 - x**5 + x**6 - x**7 + x**8 - x**9 + x**10

X = np.array([8, 9])
Y = u(X)
print("u(8) = ", u(X)[0], "or", u(8))
print("u(9) = ", u(X)[1], "or", u(9))

I create an array containing 8 and 9, and then appy the function "u" to this array. But for some reason u(X)[1] != u(9) (even though X[1] == 9):

u(8) =  954437177 or 954437177
u(9) =  -1156861335 or 3138105961

Weirdly enough, I don't have this problem for n < 9. What is wrong here? (and with me...)

0

1 Answer 1

2

Numpy does not use Python arbitrary-precision number types, internally, but (usually) machine numbers. In this case, the array X you created automatically got 32 bit integers as their type. For those, your function overflows. I couldn't easily demonstrate this in Python, but here's the same effect in Julia:

julia> u(Int32(9))
-1156861335

julia> u(Int32(8))
954437177

julia> u(Int64(9))
3138105961

julia> u(Int64(8))
954437177

julia> typemax(Int32)
2147483647

The solution is to tell np.array what types you want to use explicitely:

In [2]: X = np.array([8, 9], dtype=float)

In [4]: u(X)
Out[4]: array([9.54437177e+08, 3.13810596e+09])

In [5]: X = np.array([8, 9], dtype=np.int64)

In [6]: u(X)
Out[6]: array([ 954437177, 3138105961])

# you can use Python integers, but it's going to lose efficiency!
In [8]: X = np.array([8, 9], dtype=object)

In [9]: u(X)
Out[9]: array([954437177, 3138105961], dtype=object)

# for comparison
In [22]: X = np.array([8, 9], dtype=np.int32)

In [25]: u(X)
Out[25]: array([  954437177, -1156861335], dtype=int32)
Sign up to request clarification or add additional context in comments.

3 Comments

You can get OPs result with dtype=np.int32.
@PresidentJamesK.Polk Yeah, but that's really what they already have. What I wanted to show was u(np.int32(9)) -- which to my surprise doesn't overflow, though.
type(np.int32(2147483647) + 1) is np.int64... that's good to know.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.