[Numpy-discussion] Bizarre errors with byteswapping, complex256, PPC

Matthew Brett matthew.brett at gmail.com
Wed Jun 20 18:46:59 EDT 2012


Hi,

On Wed, Jun 20, 2012 at 3:11 PM, Matthew Brett <matthew.brett at gmail.com> wrote:
> Hi,
>
> On Wed, Jun 20, 2012 at 3:05 PM, Charles R Harris
> <charlesr.harris at gmail.com> wrote:
>>
>>
>> On Wed, Jun 20, 2012 at 4:00 PM, Matthew Brett <matthew.brett at gmail.com>
>> wrote:
>>>
>>> Hi,
>>>
>>> On Wed, Jun 20, 2012 at 1:56 PM, Travis Oliphant <travis at continuum.io>
>>> wrote:
>>> > This looks like a problem with comparisons of floating point numbers
>>> > rather than a byteswapping problem per-say.   Try to use an almost equal
>>> > comparison instead.
>>>
>>> Is that right - that the byteswapped versions might not be strictly
>>> equal to identical numbers but not byteswapped?
>>>
>>> But I should maybe have been clearer - they also subtract wrongly:
>>>
>>> <script>
>>> import numpy as np
>>>
>>> arr = np.arange(10, dtype=np.complex256)
>>> bs_arr = arr.byteswap().newbyteorder('S')
>>> print arr
>>> print bs_arr
>>> print arr - bs_arr
>>> print arr - bs_arr
>>> print arr - bs_arr
>>> </script>
>>>
>>> (np-devel)[mb312 at joshlegacy ~/tmp]$ python funny_bs.py
>>> [ 0.0+0.0j  1.0+0.0j  2.0+0.0j  3.0+0.0j  4.0+0.0j  5.0+0.0j  6.0+0.0j
>>>  7.0+0.0j  8.0+0.0j  9.0+0.0j]
>>> [ 0.0+0.0j  1.0+0.0j  2.0+0.0j  3.0+0.0j  4.0+0.0j  5.0+0.0j  6.0+0.0j
>>>  7.0+0.0j  8.0+0.0j  9.0+0.0j]
>>> [ 0.0+0.0j  1.0+0.0j  2.0+0.0j  3.0+0.0j  4.0+0.0j  5.0+0.0j  6.0+0.0j
>>>  7.0+0.0j  8.0+0.0j  9.0+0.0j]
>>> [ 0.0+0.0j  1.0+0.0j  2.0+0.0j  3.0+0.0j  4.0+0.0j  5.0+0.0j  6.0+0.0j
>>>  7.0+0.0j  8.0+0.0j  9.0+0.0j]
>>> [ 0.0+0.0j  1.0+0.0j  2.0+0.0j  3.0+0.0j  4.0+0.0j  5.0+0.0j  6.0+0.0j
>>>  7.0+0.0j  8.0+0.0j  9.0+0.0j]
>>>
>>> (wrong)
>>>
>>> (np-devel)[mb312 at joshlegacy ~/tmp]$ python funny_bs.py
>>> [ 0.0+0.0j  1.0+0.0j  2.0+0.0j  3.0+0.0j  4.0+0.0j  5.0+0.0j  6.0+0.0j
>>>  7.0+0.0j  8.0+0.0j  9.0+0.0j]
>>> [ 0.0+0.0j  1.0+0.0j  2.0+0.0j  3.0+0.0j  4.0+0.0j  5.0+0.0j  6.0+0.0j
>>>  7.0+0.0j  8.0+0.0j  9.0+0.0j]
>>> [ 0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j
>>>  0.0+0.0j  0.0+0.0j  0.0+0.0j]
>>> [ 0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j
>>>  0.0+0.0j  0.0+0.0j  0.0+0.0j]
>>> [ 0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j  0.0+0.0j
>>>  0.0+0.0j  0.0+0.0j  0.0+0.0j]
>>>
>>> (right)
>>>
>>> See you,
>>>
>>
>> Long doubles on PPC consist of two doubles, so I expect you need to swap
>> both doubles instead of 16 bytes. Strictly speaking, numpy doesn't support
>> non ieee floats.
>
> Well - the byteswapping appears to be correct in that the array is
> displayed with the correct values, but then, when doing a subtraction
> on the array, most of the time it is incorrect, but whether it is
> correct or incorrect, appears to be random even with the same
> variables and memory.
>
> Float128 and other numpy dtypes appear to be correct using the same tests.

http://projects.scipy.org/numpy/ticket/2174

Best,

Matthew



More information about the NumPy-Discussion mailing list