In [1]:
from sympy import *
import numpy as np
from scipy.special import factorial as fact

Exercise 3

a)


In [2]:
epsilon = .5
for i in range(200):
    if 1. + epsilon != 1.:
        epsilon *= .5
    else:
        print('Calculated epsilon:', epsilon * 2)
        break
print('Actual epsilon:', np.finfo(float).eps)
print('Difference between the two:', epsilon  * 2 - np.finfo(float).eps)


Calculated epsilon: 2.220446049250313e-16
Actual epsilon: 2.22044604925e-16
Difference between the two: 0.0

b)


In [3]:
def approx_exp(x):
    k = np.arange(21)
    return np.sum(x ** k / fact(k))

In [4]:
for x in [10, 1, -1, -10]:
    print (x, ':\n', (approx_exp(x) - np.exp(x)) / np.exp(x) )


10 :
 -0.0101940417669
1 :
 -1.6337129035e-16
-1 :
 3.01789907338e-16
-10 :
 2800219.89349

In [5]:
def good_exp(x):
    if x < 0:
        return 1 / approx_exp(-x)
    else:
        return approx_exp(x)

In [6]:
for x in [10, 1, -1, -10]:
    print (x, ':\n', (good_exp(x) - np.exp(x)) / np.exp(x) )


10 :
 -0.0101940417669
1 :
 -1.6337129035e-16
-1 :
 1.50894953669e-16
-10 :
 0.0102990305141

In [ ]: