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

Matthew Brett matthew.brett at gmail.com
Wed Jun 20 18:11:01 EDT 2012


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.

Best,

Matthew



More information about the NumPy-Discussion mailing list