Re: 2 + 2 = 5
On Friday, July 6, 2012 8:39:58 AM UTC+10, Andrew Cooper wrote: > On 05/07/2012 22:46, Evan Driscoll wrote: > > On 01/-10/-28163 01:59 PM, Alexander Blinne wrote: > >> 5+0 is actually 4+0, because 5 == 4, so 5+0 gives 4. > >> 5+1 is actually 4+1, which is 5, but 5 is again 4. > >> 5+2 is 4+2 which is 6. > > > > Now all I can think is "Hoory for new math, new-hoo-hoo math" > :-) > > > > Evan > > It wont do you a bit of good to read new math! > > (My mind was on exactly the same track) > > ~Andrew +1 -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On Thu, 05 Jul 2012 16:46:48 -0500, Evan Driscoll wrote: > On 01/-10/-28163 01:59 PM, Alexander Blinne wrote: >> 5+0 is actually 4+0, because 5 == 4, so 5+0 gives 4. 5+1 is actually >> 4+1, which is 5, but 5 is again 4. 5+2 is 4+2 which is 6. > > Now all I can think is "Hoory for new math, new-hoo-hoo math" :-) +1 QOTW -- Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On 05/07/2012 22:46, Evan Driscoll wrote: > On 01/-10/-28163 01:59 PM, Alexander Blinne wrote: >> 5+0 is actually 4+0, because 5 == 4, so 5+0 gives 4. >> 5+1 is actually 4+1, which is 5, but 5 is again 4. >> 5+2 is 4+2 which is 6. > > Now all I can think is "Hoory for new math, new-hoo-hoo math" :-) > > Evan It wont do you a bit of good to read new math! (My mind was on exactly the same track) ~Andrew -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On Wed, 04 Jul 2012 20:37:25 +0100, Paul Rubin wrote: I just came across this (https://gist.github.com/1208215): import sys import ctypes pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) five = ctypes.cast(id(5), pyint_p) print(2 + 2 == 5) # False five.contents[five.contents[:].index(5)] = 4 print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...) Heh. The author is apparently anonymous, I guess for good reason. Someone's been writing FORTRAN again :-) -- Rhodri James *-* Wildebeest Herder to the Masses -- http://mail.python.org/mailman/listinfo/python-list
Re: Re: 2 + 2 = 5
On 01/-10/-28163 01:59 PM, Alexander Blinne wrote: 5+0 is actually 4+0, because 5 == 4, so 5+0 gives 4. 5+1 is actually 4+1, which is 5, but 5 is again 4. 5+2 is 4+2 which is 6. Now all I can think is "Hoory for new math, new-hoo-hoo math" :-) Evan -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On 5/07/12 19:03:57, Alexander Blinne wrote: > On 05.07.2012 16:34, Laszlo Nagy wrote: > five.contents[five.contents[:].index(5)] = 4 > 5 >> 4 > 5 is 4 >> True > That's surprising, because even after changing 5 to 4 both objects still > have different id()s (tested on Py2.7), so 5 is 4 /should/ still be > False (But isn't on my 2.7). But that's some implementation detail we > are not supposed to play with ;) On my 2.7, id(5) gives the same value as id(4) == id(2+2), but id(2+3) has a different value. The 'is' operator is consistent with 'id': >>> 4 is 5 True >>> 2+2 is 2+3 False This is when using the interactive interpreter; it may be different in Idle. -- HansM -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On 05.07.2012 16:34, Laszlo Nagy wrote: five.contents[five.contents[:].index(5)] = 4 5 > 4 5 is 4 > True That's surprising, because even after changing 5 to 4 both objects still have different id()s (tested on Py2.7), so 5 is 4 /should/ still be False (But isn't on my 2.7). But that's some implementation detail we are not supposed to play with ;) > But this I don't understand: > 5+0 > 4 5+1 > 4 5+2 > 6 That's easy: 5+0 is actually 4+0, because 5 == 4, so 5+0 gives 4. 5+1 is actually 4+1, which is 5, but 5 is again 4. 5+2 is 4+2 which is 6. Greetings -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On Thu, 05 Jul 2012 15:57:53 +0200, Hans Mulder wrote: > On 5/07/12 07:32:48, Steven D'Aprano wrote: >> On Wed, 04 Jul 2012 23:38:17 -0400, Terry Reedy wrote: >> >>> If I run the script in 3.3 Idle, I get the same output you got. If I >>> then enter '5-2' interactively, I still get 3. Maybe the constant >>> folder is always on now. >> >> Yes, I believe constant folding is always on, since Python 2.4 if I >> remember correctly. Somebody who cares more than me can possibly check >> the "What's New" documents :) > > It's not a difference between 2.4 and 3.3; the difference is between > Idle and the command-line version of the interactive interpreter. > > If I type the same code into Idle and the interactive interpreter (both > using 3.3alpha1), I get 3 in Idle and 2 in Terminal. > > I don't quite understand why this difference exists. This difference exists because you are mucking about with implementation details of Python, changing things which are not guaranteed by the language, in ways that you are not supposed to change them. Since changing the value of the int 2 into that of 3 is not supported, you can hardly expect consistent behaviour. You're lucky that you don't get a segfault. (In fact, if you keep playing around with it, you likely will get a segfault.) Idle does many things differently to the basic Python interpreter. This should not surprise you. You should be surprised if it *does* work the same in Idle and the basic Python interpreter. -- Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On Thu, Jul 5, 2012 at 10:34 AM, Laszlo Nagy wrote: 5+1 > 4 4 + 1 is 5 is 4. (e.g. try 2+3 as well). -- Devin -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On 05/07/2012 15:34, Laszlo Nagy wrote: On 2012-07-04 21:37, Paul Rubin wrote: I just came across this (https://gist.github.com/1208215): import sys import ctypes pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) five = ctypes.cast(id(5), pyint_p) print(2 + 2 == 5) # False five.contents[five.contents[:].index(5)] = 4 print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...) Heh. The author is apparently anonymous, I guess for good reason. >>> five.contents[five.contents[:].index(5)] = 4 >>> 5 4 >>> 5 is 4 True But this I don't understand: >>> 5+0 4 5 is interned as 4, 0 is interned as 0, 4+0 is calculated as 4 and then interned as 4. >>> 5+1 4 5 is interned as 4, 1 is interned as 1, 4+1 is calculated as 5 and then interned as 4. >>> 5+2 6 5 is interned as 4, 2 is interned as 2, 4+2 is calculated as 6 and then interned and 6. Simple really! :-) -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On 2012-07-04 21:37, Paul Rubin wrote: I just came across this (https://gist.github.com/1208215): import sys import ctypes pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) five = ctypes.cast(id(5), pyint_p) print(2 + 2 == 5) # False five.contents[five.contents[:].index(5)] = 4 print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...) Heh. The author is apparently anonymous, I guess for good reason. >>> five.contents[five.contents[:].index(5)] = 4 >>> 5 4 >>> 5 is 4 True But this I don't understand: >>> 5+0 4 >>> 5+1 4 >>> 5+2 6 -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On 5/07/12 07:32:48, Steven D'Aprano wrote: > On Wed, 04 Jul 2012 23:38:17 -0400, Terry Reedy wrote: > >> If I run the script in 3.3 Idle, I get the same output you got. If I >> then enter '5-2' interactively, I still get 3. Maybe the constant folder >> is always on now. > > Yes, I believe constant folding is always on, since Python 2.4 if I > remember correctly. Somebody who cares more than me can possibly check > the "What's New" documents :) It's not a difference between 2.4 and 3.3; the difference is between Idle and the command-line version of the interactive interpreter. If I type the same code into Idle and the interactive interpreter (both using 3.3alpha1), I get 3 in Idle and 2 in Terminal. I don't quite understand why this difference exists. Confused, -- HansM -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On Wed, 04 Jul 2012 23:38:17 -0400, Terry Reedy wrote: > If I run the script in 3.3 Idle, I get the same output you got. If I > then enter '5-2' interactively, I still get 3. Maybe the constant folder > is always on now. Yes, I believe constant folding is always on, since Python 2.4 if I remember correctly. Somebody who cares more than me can possibly check the "What's New" documents :) -- Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On 7/4/2012 4:37 PM, Michael Ross wrote: Am 04.07.2012, 21:37 Uhr, schrieb Paul Rubin : I just came across this (https://gist.github.com/1208215): import sys import ctypes pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) five = ctypes.cast(id(5), pyint_p) print(2 + 2 == 5) # False five.contents[five.contents[:].index(5)] = 4 print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...) Heh. The author is apparently anonymous, I guess for good reason. Neat. Playing with it, i'm wondering: This: import sys import ctypes pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) five = ctypes.cast(id(5), pyint_p) five.contents[five.contents[:].index(5)] = 4 print ( 2 + 2 == 5 ) print 5 print 5 - 2 put into a script and run prints: True 4 3 The compile-time optimizer computed the contant 5-2 in C. while entered at the python prompt it prints: True 4 2 It must not run for interactive input with the undisclosed version you are running. If I run the script in 3.3 Idle, I get the same output you got. If I then enter '5-2' interactively, I still get 3. Maybe the constant folder is always on now. -- Terry Jan Reedy -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On 04Jul2012 19:39, Evan Driscoll wrote: | On 7/4/2012 14:37, Paul Rubin wrote: | > I just came across this (https://gist.github.com/1208215): | > | > import sys | > import ctypes | > pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) | > five = ctypes.cast(id(5), pyint_p) | > print(2 + 2 == 5) # False | > five.contents[five.contents[:].index(5)] = 4 | > print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...) | > | > Heh. The author is apparently anonymous, I guess for good reason. | | Probably just nostalgic for old Fortran, which, supposedly, allowed you | to change the values of literals by passing them to a function by | reference and then modifying the value. Yeah, I was thinking that too. Because all parameters were pass-by-reference in early fortran IIRC. You could, for example, set pi to 3. -- Cameron Simpson If I have seen farther than others, it is because I was standing on the shoulders of giants.- Isaac Newton If I have not seen as far as others, it is because giants were standing on my shoulders. - Hal Abelson In computer science, we stand on each other's feet. - Brian K. Reed -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On 7/4/2012 14:37, Paul Rubin wrote: > I just came across this (https://gist.github.com/1208215): > > import sys > import ctypes > pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) > five = ctypes.cast(id(5), pyint_p) > print(2 + 2 == 5) # False > five.contents[five.contents[:].index(5)] = 4 > print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...) > > Heh. The author is apparently anonymous, I guess for good reason. Probably just nostalgic for old Fortran, which, supposedly, allowed you to change the values of literals by passing them to a function by reference and then modifying the value. Evan signature.asc Description: OpenPGP digital signature -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On 07/04/2012 09:37 PM, Paul Rubin wrote: > I just came across this (https://gist.github.com/1208215): > > import sys > import ctypes > pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) > five = ctypes.cast(id(5), pyint_p) > print(2 + 2 == 5) # False > five.contents[five.contents[:].index(5)] = 4 > print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...) > > Heh. The author is apparently anonymous, I guess for good reason. > I'm reminded of the swap(a,b) function I wrote a couple of years back. http://blog.jollybox.de/archives/62-python-swap -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
On 04/07/2012 20:37, Paul Rubin wrote: I just came across this (https://gist.github.com/1208215): import sys import ctypes pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) five = ctypes.cast(id(5), pyint_p) print(2 + 2 == 5) # False five.contents[five.contents[:].index(5)] = 4 print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...) Heh. The author is apparently anonymous, I guess for good reason. The author got confused trying to switch from imperial to metric numbers or vice versa? -- Cheers. Mark Lawrence. -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
Am 04.07.2012, 21:37 Uhr, schrieb Paul Rubin : I just came across this (https://gist.github.com/1208215): import sys import ctypes pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) five = ctypes.cast(id(5), pyint_p) print(2 + 2 == 5) # False five.contents[five.contents[:].index(5)] = 4 print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...) Heh. The author is apparently anonymous, I guess for good reason. Neat. Playing with it, i'm wondering: This: import sys import ctypes pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) five = ctypes.cast(id(5), pyint_p) five.contents[five.contents[:].index(5)] = 4 print ( 2 + 2 == 5 ) print 5 print 5 - 2 put into a script and run prints: True 4 3 while entered at the python prompt it prints: True 4 2 ?? Regards, Michael -- http://mail.python.org/mailman/listinfo/python-list
Re: 2 + 2 = 5
Paul Rubin, 04.07.2012 21:37: > I just came across this (https://gist.github.com/1208215): > > import sys > import ctypes > pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) > five = ctypes.cast(id(5), pyint_p) > print(2 + 2 == 5) # False > five.contents[five.contents[:].index(5)] = 4 > print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...) > > Heh. The author is apparently anonymous, I guess for good reason. That's not portable, though. ;) Stefan -- http://mail.python.org/mailman/listinfo/python-list
2 + 2 = 5
I just came across this (https://gist.github.com/1208215): import sys import ctypes pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5)) five = ctypes.cast(id(5), pyint_p) print(2 + 2 == 5) # False five.contents[five.contents[:].index(5)] = 4 print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...) Heh. The author is apparently anonymous, I guess for good reason. -- http://mail.python.org/mailman/listinfo/python-list