Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Bizarre arithmetic results

Reply
Thread Tools

Bizarre arithmetic results

 
 
Terrence Cole
Guest
Posts: n/a
 
      02-11-2010
Can someone explain to me what python is doing here?

Python 3.1.1 (r311:74480, Feb 3 2010, 13:36:47)
[GCC 4.3.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> -0.1 ** 0.1

-0.7943282347242815
>>> a = -0.1; b = 0.1
>>> a ** b

(0.7554510437117542+0.2454609236416552j)
>>> -abs(a ** b)

-0.7943282347242815

Why does the literal version return the signed magnitude and the
variable version return a complex?

Cheers,
Terrence

 
Reply With Quote
 
 
 
 
Peter Otten
Guest
Posts: n/a
 
      02-11-2010
Terrence Cole wrote:

> Can someone explain to me what python is doing here?
>
> Python 3.1.1 (r311:74480, Feb 3 2010, 13:36:47)
> [GCC 4.3.4] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>>>> -0.1 ** 0.1

> -0.7943282347242815
>>>> a = -0.1; b = 0.1
>>>> a ** b

> (0.7554510437117542+0.2454609236416552j)
>>>> -abs(a ** b)

> -0.7943282347242815
>
> Why does the literal version return the signed magnitude and the
> variable version return a complex?


Operator precedence.

>>> -0.1**0.1

-0.7943282347242815
>>> (-0.1)**0.1

(0.7554510437117542+0.2454609236416552j)

Quoting http://docs.python.org/3.1/reference/expressions.html:

"""
The power operator binds more tightly than unary operators on its left; it
binds less tightly than unary operators on its right.
"""

Peter
 
Reply With Quote
 
 
 
 
Mark Dickinson
Guest
Posts: n/a
 
      02-11-2010
On Feb 11, 12:44*am, Terrence Cole <list-
(E-Mail Removed)> wrote:
> Can someone explain to me what python is doing here?


> >>> -0.1 ** 0.1

> -0.7943282347242815


Here you're computing -(0.1 ** 0.1). The exponentiation operator
binds more strongly than the negation operator.

> >>> a = -0.1; b = 0.1
> >>> a ** b

> (0.7554510437117542+0.2454609236416552j)


Here you're computing (-0.1) ** 0.1.

--
Mark
 
Reply With Quote
 
Jussi Piitulainen
Guest
Posts: n/a
 
      02-11-2010
Terrence Cole writes:

> Can someone explain to me what python is doing here?
>
> Python 3.1.1 (r311:74480, Feb 3 2010, 13:36:47)
> [GCC 4.3.4] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> -0.1 ** 0.1

> -0.7943282347242815
> >>> a = -0.1; b = 0.1
> >>> a ** b

> (0.7554510437117542+0.2454609236416552j)
> >>> -abs(a ** b)

> -0.7943282347242815
>
> Why does the literal version return the signed magnitude and the
> variable version return a complex?


The minus sign is not part of the literal syntax. Python takes the
expression as -(0.1 ** 0.1), the binary operator binding tighter than
the unary.

Try (-0.1) ** 0.1, and try a = 0.1, then -a ** 0.1.
 
Reply With Quote
 
Grant Edwards
Guest
Posts: n/a
 
      02-11-2010
On 2010-02-11, Terrence Cole <(E-Mail Removed)> wrote:
> Can someone explain to me what python is doing here?
>
> Python 3.1.1 (r311:74480, Feb 3 2010, 13:36:47)
> [GCC 4.3.4] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>>>> -0.1 ** 0.1

> -0.7943282347242815
>>>> a = -0.1; b = 0.1
>>>> a ** b

> (0.7554510437117542+0.2454609236416552j)
>>>> -abs(a ** b)

> -0.7943282347242815
>
> Why does the literal version return the signed magnitude and the
> variable version return a complex?


Didn't we just do this one last week?

--
Grant Edwards grante Yow! Hello? Enema Bondage?
at I'm calling because I want
visi.com to be happy, I guess ...
 
Reply With Quote
 
Aahz
Guest
Posts: n/a
 
      02-12-2010
In article <hl1j4a$j61$(E-Mail Removed)>,
Grant Edwards <(E-Mail Removed)> wrote:
>
>Didn't we just do this one last week?


Let's do the Time Warp again!
--
Aahz ((E-Mail Removed)) <*> http://www.pythoncraft.com/

"At Resolver we've found it useful to short-circuit any doubt and just
refer to comments in code as 'lies'. "
 
Reply With Quote
 
Albert van der Horst
Guest
Posts: n/a
 
      02-22-2010
In article <(E-Mail Removed)>,
Terrence Cole <(E-Mail Removed)> wrote:
>Can someone explain to me what python is doing here?
>
>Python 3.1.1 (r311:74480, Feb 3 2010, 13:36:47)
>[GCC 4.3.4] on linux2
>Type "help", "copyright", "credits" or "license" for more information.
>>>> -0.1 ** 0.1


Python 4.0
Warning: misleading blank space, expected:
- 0.1**0.1

>-0.7943282347242815
>>>> a = -0.1; b = 0.1
>>>> a ** b

>(0.7554510437117542+0.2454609236416552j)
>>>> -abs(a ** b)

>-0.7943282347242815
>
>Why does the literal version return the signed magnitude and the
>variable version return a complex?
>
>Cheers,
>Terrence
>



--
--
Albert van der Horst, UTRECHT,THE NETHERLANDS
Economic growth -- being exponential -- ultimately falters.
albert@spe&ar&c.xs4all.nl &=n http://home.hccnet.nl/a.w.m.van.der.horst

 
Reply With Quote
 
Steven D'Aprano
Guest
Posts: n/a
 
      02-23-2010
On Mon, 22 Feb 2010 18:01:44 +0000, Albert van der Horst wrote:

> In article <(E-Mail Removed)>,
> Terrence Cole <(E-Mail Removed)> wrote:
>>Can someone explain to me what python is doing here?
>>
>>Python 3.1.1 (r311:74480, Feb 3 2010, 13:36:47) [GCC 4.3.4] on linux2
>>Type "help", "copyright", "credits" or "license" for more information.
>>>>> -0.1 ** 0.1

>
> Python 4.0
> Warning: misleading blank space, expected:
> - 0.1**0.1
>
>>-0.7943282347242815



Making spaces significant in that fashion is mind-bogglingly awful. Let's
look at a language that does this:

[steve@sylar ~]$ cat ws-example.rb
def a(x=4)
x+2
end

b = 1
print (a + b), (a+b), (a+ b), (a +b), "\n"


[steve@sylar ~]$ ruby ws-example.rb
7773




--
Steven
 
Reply With Quote
 
Mark Dickinson
Guest
Posts: n/a
 
      02-23-2010
On Feb 23, 8:11*am, Steven D'Aprano
<(E-Mail Removed)> wrote:
> Making spaces significant in that fashion is mind-bogglingly awful. Let's
> look at a language that does this:
>
> [steve@sylar ~]$ cat ws-example.rb
> def a(x=4)
> * * x+2
> end
>
> b = 1
> print (a + b), (a+b), (a+ b), (a +b), "\n"
>
> [steve@sylar ~]$ ruby ws-example.rb
> 7773


Hmm. That's pretty nasty, all right. Not that Python can claim to be
immune to such behaviour:

>>> 3 .real

3
>>> 3. real

File "<stdin>", line 1
3. real
^
SyntaxError: invalid syntax


Though the fact that one of the cases raises an exception (rather than
silently giving some different behaviour) ameliorates things a bit.

--
Mark
 
Reply With Quote
 
Steven D'Aprano
Guest
Posts: n/a
 
      02-24-2010
On Tue, 23 Feb 2010 05:48:09 -0800, Mark Dickinson wrote:

> On Feb 23, 8:11*am, Steven D'Aprano
> <(E-Mail Removed)> wrote:
>> Making spaces significant in that fashion is mind-bogglingly awful.
>> Let's look at a language that does this:
>>
>> [steve@sylar ~]$ cat ws-example.rb
>> def a(x=4)
>> * * x+2
>> end
>>
>> b = 1
>> print (a + b), (a+b), (a+ b), (a +b), "\n"
>>
>> [steve@sylar ~]$ ruby ws-example.rb
>> 7773

>
> Hmm. That's pretty nasty, all right. Not that Python can claim to be
> immune to such behaviour:
>
>>>> 3 .real

> 3
>>>> 3. real

> File "<stdin>", line 1
> 3. real
> ^
> SyntaxError: invalid syntax
>
>
> Though the fact that one of the cases raises an exception (rather than
> silently giving some different behaviour) ameliorates things a bit.


It ameliorates it *completely* -- you won't get silent errors in Python
because you add or delete whitespace around a dot.


"I find it amusing when novice programmers believe their main job is
preventing programs from crashing. ... More experienced programmers
realize that correct code is great, code that crashes could use
improvement, but incorrect code that doesn't crash is a horrible
nightmare."

http://www.pphsg.org/cdsmith/types.html


The edge case occurs because dot does double-duty as an operator and as
part of float literals. However, float literals never include whitespace:

>>> 1.5

1.5
>>> 1 . 5

File "<stdin>", line 1
1 . 5
^
SyntaxError: invalid syntax

and likewise for 1. 5 and 1 .5 -- the only way to get a float literal
with a decimal point is by not including whitespace in it. So there is
never any ambiguity about floats. You can even do this:

>>> 1.5.__str__()

'1.5'


And since . is an operator outside of float literals, you can do this:

>>> import sys
>>> sys . platform

'linux2'


although why you'd want to escapes me

This actually is a feature, since it is useful when calling methods on
int literals. However this is a very rare thing to do.



--
Steven
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: Bizarre arithmetic results Robert Kern Python 5 02-12-2010 05:48 PM
Arithmetic addition with strange results dizzy C++ 1 09-10-2008 04:32 PM
bizarre id() results Stuart McGraw Python 3 12-15-2005 09:48 PM
Usual Arithmetic Conversions-arithmetic expressions joshc C Programming 5 03-31-2005 02:23 AM
Bizarre profiler results Chris Java 3 08-01-2003 08:04 PM



Advertisments