![](https://secure.gravatar.com/avatar/bfc96d2a02d9113edb992eb96c205c5a.jpg?s=120&d=mm&r=g)
you can write a if in_pypy wrapper that uses __pypy__.intops or something, but for exactly the same code is hard to do better. We can think about adding some optimizations that do that btw On Mon, Apr 4, 2016 at 3:53 PM, Tuom Larsen <tuom.larsen@gmail.com> wrote:
So other than numpy, do you think:
a[0] = (2**63 << 1) & (2**64 - 1)
is the best way I can do?
On Mon, Apr 4, 2016 at 3:52 PM, Tuom Larsen <tuom.larsen@gmail.com> wrote:
Yes, I just want to write code which is portable (as for example that `& ...`) but still favors PyPy.
On Mon, Apr 4, 2016 at 3:49 PM, Maciej Fijalkowski <fijall@gmail.com> wrote:
right, so there is no way to get wrap-around arithmetics in cpython without modifications
On Mon, Apr 4, 2016 at 3:48 PM, Tuom Larsen <tuom.larsen@gmail.com> wrote:
I would like to avoid numpy, if possible. Even if it might be bundled with PyPy (is it?) I still would like the code to run in CPython with no dependencies.
On Mon, Apr 4, 2016 at 3:45 PM, Maciej Fijalkowski <fijall@gmail.com> wrote:
so numpy64 will give you wrap-around arithmetics. What else are you looking for? :-)
On Mon, Apr 4, 2016 at 3:38 PM, Tuom Larsen <tuom.larsen@gmail.com> wrote:
You mean I should first store the result into numpy's `int64`, and then to `array.array`? Like:
x = int64(2**63 << 1) a[0] = x
Or:
x = int64(2**63) x[0] = x << 1
What the "real types" goes, is this the only option?
Thanks in any case!
On Mon, Apr 4, 2016 at 3:32 PM, Maciej Fijalkowski <fijall@gmail.com> wrote: > one option would be to use integers from _numpypy module: > > from numpy import int64 after installing numpy. > > There are obscure ways to get it without installing numpy. Another > avenue would be to use __pypy__.intop.int_mul etc. > > Feel free to complain "no, I want real types that I can work with" :-) > > Cheers, > fijal > > On Mon, Apr 4, 2016 at 3:10 PM, Tuom Larsen <tuom.larsen@gmail.com> wrote: >> Hello! >> >> Suppose I'm on 64-bit machine and there is an `a = arrar.array('L', >> [0])` (item size is 8 bytes). In Python, when an integer does not fit >> machine width it gets promoted to "long" integer of arbitrary size. So >> this will fail: >> >> a[0] = 2**63 << 1 >> >> To fix this, one could instead write: >> >> a[0] = (2**63 << 1) & (2**64 - 1) >> >> My question is, when I know that the result will be stored in >> `array.array` anyway, how to prevent the promotion to long integers? >> What is the most performat way to perform such calculations? Is PyPy >> able to optimize away that `& (2**64 - 1)` when I use `'L'` typecode? >> >> I mean, in C I wouldn't have to worry about it as everything above the >> 63rd bit will be simply cut off. I would like to help PyPy to generate >> the best possible code, does anyone have some suggestions please? >> >> Thanks! >> _______________________________________________ >> pypy-dev mailing list >> pypy-dev@python.org >> https://mail.python.org/mailman/listinfo/pypy-dev