Peculiar boundary cases:
[color=blue][color=green][color=darkred]
>>> 2.0**31-1.0[/color][/color][/color]
2147483647.0[color=blue][color=green][color=darkred]
>>> int(2147483647. 0)[/color][/color][/color]
2147483647L[color=blue][color=green][color=darkred]
>>> int(2147483647L )[/color][/color][/color]
2147483647[color=blue][color=green][color=darkred]
>>>
>>> -2.0**31[/color][/color][/color]
-2147483648.0[color=blue][color=green][color=darkred]
>>> int(-2147483648.0)[/color][/color][/color]
-2147483648L[color=blue][color=green][color=darkred]
>>> int(-2147483648L )[/color][/color][/color]
-2147483648
some kind of one-off error? I.e., just inside extremes works:
[color=blue][color=green][color=darkred]
>>> [int(x) for x in (-2.0**31, -2.0**31+1.0, 2.0**31-2.0, 2.0**31-1.0)][/color][/color][/color]
[-2147483648L, -2147483647, 2147483646, 2147483647L]
But those longs at the extremes can be converted successfully, so int(int(x)) works ;-/
[color=blue][color=green][color=darkred]
>>> [int(int(x)) for x in (-2.0**31, -2.0**31+1.0, 2.0**31-2.0, 2.0**31-1.0)][/color][/color][/color]
[-2147483648, -2147483647, 2147483646, 2147483647]
ISTM this is a buglet, or at least a wartlet for a 32-bit system ;-)
Almost forgot:
Python 2.4b1 (#56, Nov 3 2004, 01:47:27)
[GCC 3.2.3 (mingw special 20030504-1)] on win32
but same thing on 2.3.2:
Python 2.3.2 (#49, Oct 2 2003, 20:02:00) [MSC v.1200 32 bit (Intel)] on win32
Type "help", "copyright" , "credits" or "license" for more information.[color=blue][color=green][color=darkred]
>>> [int(x) for x in (-2.0**31, -2.0**31+1.0, 2.0**31-2.0, 2.0**31-1.0)][/color][/color][/color]
[-2147483648L, -2147483647, 2147483646, 2147483647L][color=blue][color=green][color=darkred]
>>> [int(int(x)) for x in (-2.0**31, -2.0**31+1.0, 2.0**31-2.0, 2.0**31-1.0)][/color][/color][/color]
[-2147483648, -2147483647, 2147483646, 2147483647]
Hm, ... except for the thought that CPUs with 64-bit integers might truncate maxint
when converting to float, I might say maybe these reprs should be tested
for equality in the system tests?
[color=blue][color=green][color=darkred]
>>> import sys
>>> repr(int(float( sys.maxint))), repr(sys.maxint )[/color][/color][/color]
('2147483647L', '2147483647')[color=blue][color=green][color=darkred]
>>> repr(int(float(-sys.maxint-1))), repr(-sys.maxint-1)[/color][/color][/color]
('-2147483648L', '-2147483648')
or maybe at least check for equality of these?:
[color=blue][color=green][color=darkred]
>>> type(int(float( sys.maxint))), type(sys.maxint )[/color][/color][/color]
(<type 'long'>, <type 'int'>)[color=blue][color=green][color=darkred]
>>> type(int(float(-sys.maxint-1))), type(-sys.maxint-1)[/color][/color][/color]
(<type 'long'>, <type 'int'>)
Regards,
Bengt Richter
[color=blue][color=green][color=darkred]
>>> 2.0**31-1.0[/color][/color][/color]
2147483647.0[color=blue][color=green][color=darkred]
>>> int(2147483647. 0)[/color][/color][/color]
2147483647L[color=blue][color=green][color=darkred]
>>> int(2147483647L )[/color][/color][/color]
2147483647[color=blue][color=green][color=darkred]
>>>
>>> -2.0**31[/color][/color][/color]
-2147483648.0[color=blue][color=green][color=darkred]
>>> int(-2147483648.0)[/color][/color][/color]
-2147483648L[color=blue][color=green][color=darkred]
>>> int(-2147483648L )[/color][/color][/color]
-2147483648
some kind of one-off error? I.e., just inside extremes works:
[color=blue][color=green][color=darkred]
>>> [int(x) for x in (-2.0**31, -2.0**31+1.0, 2.0**31-2.0, 2.0**31-1.0)][/color][/color][/color]
[-2147483648L, -2147483647, 2147483646, 2147483647L]
But those longs at the extremes can be converted successfully, so int(int(x)) works ;-/
[color=blue][color=green][color=darkred]
>>> [int(int(x)) for x in (-2.0**31, -2.0**31+1.0, 2.0**31-2.0, 2.0**31-1.0)][/color][/color][/color]
[-2147483648, -2147483647, 2147483646, 2147483647]
ISTM this is a buglet, or at least a wartlet for a 32-bit system ;-)
Almost forgot:
Python 2.4b1 (#56, Nov 3 2004, 01:47:27)
[GCC 3.2.3 (mingw special 20030504-1)] on win32
but same thing on 2.3.2:
Python 2.3.2 (#49, Oct 2 2003, 20:02:00) [MSC v.1200 32 bit (Intel)] on win32
Type "help", "copyright" , "credits" or "license" for more information.[color=blue][color=green][color=darkred]
>>> [int(x) for x in (-2.0**31, -2.0**31+1.0, 2.0**31-2.0, 2.0**31-1.0)][/color][/color][/color]
[-2147483648L, -2147483647, 2147483646, 2147483647L][color=blue][color=green][color=darkred]
>>> [int(int(x)) for x in (-2.0**31, -2.0**31+1.0, 2.0**31-2.0, 2.0**31-1.0)][/color][/color][/color]
[-2147483648, -2147483647, 2147483646, 2147483647]
Hm, ... except for the thought that CPUs with 64-bit integers might truncate maxint
when converting to float, I might say maybe these reprs should be tested
for equality in the system tests?
[color=blue][color=green][color=darkred]
>>> import sys
>>> repr(int(float( sys.maxint))), repr(sys.maxint )[/color][/color][/color]
('2147483647L', '2147483647')[color=blue][color=green][color=darkred]
>>> repr(int(float(-sys.maxint-1))), repr(-sys.maxint-1)[/color][/color][/color]
('-2147483648L', '-2147483648')
or maybe at least check for equality of these?:
[color=blue][color=green][color=darkred]
>>> type(int(float( sys.maxint))), type(sys.maxint )[/color][/color][/color]
(<type 'long'>, <type 'int'>)[color=blue][color=green][color=darkred]
>>> type(int(float(-sys.maxint-1))), type(-sys.maxint-1)[/color][/color][/color]
(<type 'long'>, <type 'int'>)
Regards,
Bengt Richter
Comment