[pypy-dev] Shift and typed array

Tuom Larsen tuom.larsen at gmail.com
Mon Apr 4 09:38:39 EDT 2016


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 at 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 at 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 at python.org
>> https://mail.python.org/mailman/listinfo/pypy-dev


More information about the pypy-dev mailing list