Files
David Beazley b0b7b7cf54 Fixed typo
2020-05-29 17:08:59 -05:00

268 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[Contents](../Contents.md) \| [Previous (1.2 A First Program)](02_Hello_world.md) \| [Next (1.4 Strings)](04_Strings.md)
# 1.3 Numbers
This section discusses mathematical calculations.
### Types of Numbers
Python has 4 types of numbers:
* Booleans
* Integers
* Floating point
* Complex (imaginary numbers)
### Booleans (bool)
Booleans have two values: `True`, `False`.
```python
a = True
b = False
```
Numerically, they're evaluated as integers with value `1`, `0`.
```python
c = 4 + True # 5
d = False
if d == 0:
print('d is False')
```
*But, don't write code like that. It would be odd.*
### Integers (int)
Signed values of arbitrary size and base:
```python
a = 37
b = -299392993727716627377128481812241231
c = 0x7fa8 # Hexadecimal
d = 0o253 # Octal
e = 0b10001111 # Binary
```
Common operations:
```
x + y Add
x - y Subtract
x * y Multiply
x / y Divide (produces a float)
x // y Floor Divide (produces an integer)
x % y Modulo (remainder)
x ** y Power
x << n Bit shift left
x >> n Bit shift right
x & y Bit-wise AND
x | y Bit-wise OR
x ^ y Bit-wise XOR
~x Bit-wise NOT
abs(x) Absolute value
```
### Floating point (float)
Use a decimal or exponential notation to specify a floating point value:
```python
a = 37.45
b = 4e5 # 4 x 10**5 or 400,000
c = -1.345e-10
```
Floats are represented as double precision using the native CPU representation [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754).
This is the same as the `double` type in the programming language C.
> 17 digits or precision
> Exponent from -308 to 308
Be aware that floating point numbers are inexact when representing decimals.
```python
>>> a = 2.1 + 4.2
>>> a == 6.3
False
>>> a
6.300000000000001
>>>
```
This is **not a Python issue**, but the underlying floating point hardware on the CPU.
Common Operations:
```
x + y Add
x - y Subtract
x * y Multiply
x / y Divide
x // y Floor Divide
x % y Modulo
x ** y Power
abs(x) Absolute Value
```
Theses are the same operators as Integers, except for the bit-wise operators.
Additional math functions are found in the `math` module.
```python
import math
a = math.sqrt(x)
b = math.sin(x)
c = math.cos(x)
d = math.tan(x)
e = math.log(x)
```
### Comparisons
The following comparison / relational operators work with numbers:
```
x < y Less than
x <= y Less than or equal
x > y Greater than
x >= y Greater than or equal
x == y Equal to
x != y Not equal to
```
You can form more complex boolean expressions using
`and`, `or`, `not`
Here are a few examples:
```python
if b >= a and b <= c:
print('b is between a and c')
if not (b < a or b > c):
print('b is still between a and c')
```
### Converting Numbers
The type name can be used to convert values:
```python
a = int(x) # Convert x to integer
b = float(x) # Convert x to float
```
Try it out.
```python
>>> a = 3.14159
>>> int(a)
3
>>> b = '3.14159' # It also works with strings containing numbers
>>> float(b)
3.14159
>>>
```
## Exercises
Reminder: These exercises assume you are working in the `practical-python/Work` directory. Look
for the file `mortgage.py`.
### Exercise 1.7: Dave's mortgage
Dave has decided to take out a 30-year fixed rate mortgage of $500,000
with Guidos Mortgage, Stock Investment, and Bitcoin trading
corporation. The interest rate is 5% and the monthly payment is
$2684.11.
Here is a program that calculates the total amount that Dave will have
to pay over the life of the mortgage:
```python
# mortgage.py
principal = 500000.0
rate = 0.05
payment = 2684.11
total_paid = 0.0
while principal > 0:
principal = principal * (1+rate/12) - payment
total_paid = total_paid + payment
print('Total paid', total_paid)
```
Enter this program and run it. You should get an answer of `966,279.6`.
### Exercise 1.8: Extra payments
Suppose Dave pays an extra $1000/month for the first 12 months of the mortgage?
Modify the program to incorporate this extra payment and have it print the total amount paid along with the number of months required.
When you run the new program, it should report a total payment of `929,965.62` over 342 months.
### Exercise 1.9: Making an Extra Payment Calculator
Modify the program so that extra payment information can be more generally handled.
Make it so that the user can set these variables:
```python
extra_payment_start_month = 60
extra_payment_end_month = 108
extra_payment = 1000
```
Make the program look at these variables and calculate the total paid appropriately.
How much will Dave pay if he pays an extra $1000/month for 4 years starting in year 5 of the mortgage?
### Exercise 1.10: Making a table
Modify the program to print out a table showing the month, total paid so far, and the remaining principal.
The output should look something like this:
```bash
1 2684.11 499399.22
2 5368.22 498795.94
3 8052.33 498190.15
4 10736.44 497581.83
5 13420.55 496970.98
...
308 875705.88 674.44
309 878389.99 -2006.86
Total paid 878389.99
Months 309
```
### Exercise 1.11: Bonus
While youre at it, fix the program to correct the for overpayment that occurs in the last month.
### Exercise 1.12: A Mystery
`int()` and `float()` can be used to convert numbers. For example,
```python
>>> int("123")
123
>>> float("1.23")
1.23
>>>
```
With that in mind, can you explain this behavior?
```python
>>> bool("False")
True
>>>
```
[Contents](../Contents.md) \| [Previous (1.2 A First Program)](02_Hello_world.md) \| [Next (1.4 Strings)](04_Strings.md)