Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wrong math with Python?

Just starting out with Python, so this is probably my mistake, but...

I'm trying out Python. I like to use it as a calculator, and I'm slowly working through some tutorials.

I ran into something weird today. I wanted to find out 2013*2013, but I wrote the wrong thing and wrote 2013*013, and got this:

>>> 2013*013 22143 

I checked with my calculator, and 22143 is the wrong answer! 2013 * 13 is supposed to be 26169.

Why is Python giving me a wrong answer? My old Casio calculator doesn't do this...

like image 305
James Elegan Avatar asked Apr 09 '13 05:04

James Elegan


People also ask

Which type of mathematics is used in Python?

For straightforward mathematical calculations in Python, you can use the built-in mathematical operators, such as addition ( + ), subtraction ( - ), division ( / ), and multiplication ( * ). But more advanced operations, such as exponential, logarithmic, trigonometric, or power functions, are not built in.

Is there any maths in Python?

Python has a set of built-in math functions, including an extensive math module, that allows you to perform mathematical tasks on numbers.

Why is doing math in Python helpful?

Doing Math with Python shows you how to use Python to delve into high school–level math topics like statistics, geometry, probability, and calculus. You'll start with simple projects, like a factoring program and a quadratic-equation solver, and then create more complex projects once you've gotten the hang of things.


2 Answers

Because of octal arithmetic, 013 is actually the integer 11.

>>> 013 11 

With a leading zero, 013 is interpreted as a base-8 number and 1*81 + 3*80 = 11.

Note: this behaviour was changed in python 3. Here is a particularly appropriate quote from PEP 3127

The default octal representation of integers is silently confusing to people unfamiliar with C-like languages. It is extremely easy to inadvertently create an integer object with the wrong value, because '013' means 'decimal 11', not 'decimal 13', to the Python language itself, which is not the meaning that most humans would assign to this literal.

like image 158
wim Avatar answered Oct 26 '22 23:10

wim


013 is an octal integer literal (equivalent to the decimal integer literal 11), due to the leading 0.

>>> 2013*013 22143 >>> 2013*11 22143 >>> 2013*13 26169 

It is very common (certainly in most of the languages I'm familiar with) to have octal integer literals start with 0 and hexadecimal integer literals start with 0x. Due to the exact confusion you experienced, Python 3 raises a SyntaxError:

>>> 2013*013   File "<stdin>", line 1     2013*013            ^ SyntaxError: invalid token 

and requires either 0o or 0O instead:

>>> 2013*0o13 22143 >>> 2013*0O13 22143  
like image 34
Darshan Rivka Whittle Avatar answered Oct 26 '22 22:10

Darshan Rivka Whittle