Re: 2 + 2 = 5

2012-07-15 Thread samuel . marks
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

2012-07-05 Thread Steven D'Aprano
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

2012-07-05 Thread Andrew Cooper
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

2012-07-05 Thread Rhodri James
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

2012-07-05 Thread Evan Driscoll

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

2012-07-05 Thread Hans Mulder
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

2012-07-05 Thread Alexander Blinne
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

2012-07-05 Thread Steven D'Aprano
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

2012-07-05 Thread Devin Jeanpierre
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

2012-07-05 Thread MRAB

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

2012-07-05 Thread Laszlo Nagy

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

2012-07-05 Thread Hans Mulder
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

2012-07-04 Thread Steven D'Aprano
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

2012-07-04 Thread Terry Reedy

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

2012-07-04 Thread Cameron Simpson
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

2012-07-04 Thread Evan Driscoll
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

2012-07-04 Thread Thomas Jollans
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

2012-07-04 Thread Mark Lawrence

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

2012-07-04 Thread Michael Ross

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

2012-07-04 Thread Stefan Behnel
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

2012-07-04 Thread 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.
-- 
http://mail.python.org/mailman/listinfo/python-list