#!/usr/bin/env python
# coding: utf-8

# # Gleitkommaarithmetik

# In[1]:


import numpy as np
np.set_printoptions(legacy = '1.25')


# ## Maschinengenauigkeit

# In[2]:


1 + 2**(-52) > 1


# In[3]:


1 + 2**(-53) > 1


# In[4]:


2**(-52)


# In[5]:


n = 1
while (1 + 2**(-n)) > 1:
    n += 1
print('2^(-{0})'.format(n-1))


# ## Darstellung von Zahlen im Computer

# In[6]:


from sympy import *
N(1, 50), N(-10, 50), N(-0.125, 50)


# In[7]:


N(0.1, 50)


# ## Kondition einer Matrix

# Die Funktion numpy.linalg.cond berechnet default-mäßig die Kondition einer Matrix $A$ als $\kappa = \|A\|_2\|A^{-1}\|_2$

# In[8]:


# Variante 1
A = np.array([[1e-20, 1],
              [1,     1]])

L = np.array([[1,    0],
              [1e20, 1]])

R = np.array([[1e-20,       1],
              [0,     1-1e20]])

np.linalg.norm(A - L@R)


# In[9]:


R


# In[10]:


np.linalg.cond(L), np.linalg.cond(R)


# In[11]:


# Variante 2
A = np.array([[1e-20, 1],
              [1,     1]])

P = np.array([[0, 1],
              [1, 0]])

L = np.array([[1,    0],
              [1e-20, 1]])

R = np.array([[1,       1],
              [0, 1-1e-20]])

np.linalg.norm(P@A - L@R)


# In[12]:


np.linalg.cond(L), np.linalg.cond(R)


# In[ ]:




