Compare commits

..
4 Commits
Author SHA1 Message Date
schrom01 d2c1d957e8 updated Task 4 2022-10-13 13:31:53 +02:00
schrom01 ca306c728b updated Task 2+3 2022-10-13 12:56:55 +02:00
schrom01 fc3bbc49cc updated Task 1 2022-10-13 12:43:15 +02:00
leobr d364086bb1 code improvement implemented 2022-10-12 16:04:26 +02:00
4 changed files with 23 additions and 24 deletions
Binary file not shown.
+6 -6
View File
@@ -34,9 +34,9 @@ print(f'min f2: {min(yf2)} max f2: {max(yf2)}')
# sodass Rundungsfehler entstehen wenn die Werte als Fliesskommazahlen # sodass Rundungsfehler entstehen wenn die Werte als Fliesskommazahlen
# zwischengespeichert werden. In den zwei Funktionen f1 und f2 werden die # zwischengespeichert werden. In den zwei Funktionen f1 und f2 werden die
# Rechenoperationen in einer anderen Reihenfolge ausgeführt. # Rechenoperationen in einer anderen Reihenfolge ausgeführt.
# bei f1 werden die Terme addiert. Entsprechend ist beim Runden nur der Term mit dem # bei f1 werden die Terme addiert. Damit werden die Rundungsfehler Kummuliert.
# grössten Exponent dominant. # bei f2 erhält man immer eine Zahl nahe bei 0 da nur eine Subtraktion durchgeführt
# bei f2 erhält man immer eine Zahl nahe bei 0. # wird die einen zu einem Rundungsfehler führen kann.
# Aufgabe 2b # Aufgabe 2b
xmin = -10 ** -14 xmin = -10 ** -14
@@ -56,6 +56,7 @@ print(f'min g1: {min(yg1)} max g1: {max(yg1)}')
# Die Berechnung des Grenzwertes für x --> 0 g(x) ist nicht stabil. # Die Berechnung des Grenzwertes für x --> 0 g(x) ist nicht stabil.
# Der Grenzwert scheint unendlich gross / klein zu sein. # Der Grenzwert scheint unendlich gross / klein zu sein.
# Bei g1 ist der Nenner sehr gross wenn x --> 0.
# Aufgabe 2c # Aufgabe 2c
# a = 1+x, b = 1 # a = 1+x, b = 1
@@ -71,9 +72,8 @@ print(f'min g2: {min(yg2)} max g2: {max(yg2)}')
plt.legend() plt.legend()
plt.title("Aufgabe 2bc") plt.title("Aufgabe 2bc")
# Der Grenzwert für x = 0 beträgt 1.85. Die Funktion ist nun stabil. Bei g1 ist der Nenner 0 wenn x = 0 # Bei der Funktion g2 bleibt der Wert stabil bei 1.85. Somit ist dies der Grenzwert.
# Bei der Funktion g2 bleibt der Wert stabil bei 1.85. # Die Auslöschung kann vermieden werden indem Sinus und Cosinus im Nenner stehen.
# Die Auslöschung kann vermieden werden, Wenn X gegen 0 geht wurde der Nenner sehr gross.
plt.show() plt.show()
+7 -6
View File
@@ -22,7 +22,7 @@ for i in range(50):
sum_s_new = sn_new * n sum_s_new = sn_new * n
pi2 = sum_s pi2 = sum_s
pi2_new = sum_s_new pi2_new = sum_s_new
print("n: ", n, " sn: ", sn_new, " pi: ", pi2) print(f'n: {n} sn: {sn_new} pi: {pi2}')
x = np.append(x, n) x = np.append(x, n)
y = np.append(y, pi2) y = np.append(y, pi2)
y_new = np.append(y_new, pi2_new) y_new = np.append(y_new, pi2_new)
@@ -31,16 +31,17 @@ for i in range(50):
sn = s2n(sn) sn = s2n(sn)
sn_new = s2n_new(sn_new) sn_new = s2n_new(sn_new)
plt.plot(x, y) plt.plot(x, y, label='2*pi')
plt.plot(x, y_new) plt.plot(x, y_new, label='2*pi_new')
plt.xscale('log', base=2) plt.xscale('log', base=2)
plt.xlim((2 ** 3, 2 ** 31)) plt.xlim((2 ** 3, 2 ** 31))
plt.ylim((6.25, 6.3)) plt.ylim((6.25, 6.3))
plt.legend(["2*pi", "2*pi_new"]) plt.legend()
plt.title("Aufgabe 3") plt.title("Aufgabe 3")
plt.show() plt.show()
# mit der ersten Formel stimmt der berechnete Wert ab n = 50331648 nicht mehr. # mit der ersten Formel stimmt der berechnete Wert ab n = 50331648 nicht mehr.
# mit n = 805306368 erhält man für pi 6, danach immer 0. # Durch Rundungsfehler steigt der Wert fälschlicherweise an und fällt anschliessend durch
# mit der zweiten Formel tritt der Fehler nicht auf. # Auslöschung auf 0.
# mit der zweiten Formel tritt der Fehler nicht auf und der Wert nähert sich an 2*pi
+10 -12
View File
@@ -3,19 +3,19 @@ def eps(base, n): # n = Anzahl Stellen der Mantisse
return 0.5 * (base ** (1-n)) return 0.5 * (base ** (1-n))
def digitsMantiss(base): # -5*10^-17 def bitsMantiss(base):
last_x = 0 last_x = 0
x = 1.5 x = 1.5
n = 1 n = 0
while x > 1: while x > 1:
last_x = x last_x = x
x = x - (x - 1) / base x = x - (x - 1) / base
n = n + 1 n = n + 1
return n, last_x return n, last_x
def largestNumber(digitsMantiss): def largestNumber(bitsMantiss):
x = 0.0 x = 0.0
for i in range(digitsMantiss): for i in range(bitsMantiss):
x = x + 2 ** i x = x + 2 ** i
return x return x
@@ -23,16 +23,14 @@ def largestNumber_eps(eps, n):
return eps * 2**(2*n) - 1 return eps * 2**(2*n) - 1
bitsMan = bitsMantiss(2)
epsVal = eps(2, bitsMan[0])
digMan = digitsMantiss(2) largest = largestNumber(bitsMan[0])
epsVal = eps(2, digMan[0]) largest_eps = largestNumber_eps(epsVal, bitsMan[0])
largest = largestNumber(digMan[0])
largest_eps = largestNumber_eps(epsVal, digMan[0])
print(f'eps: {epsVal}') print(f'eps: {epsVal}')
print(f'Digits Mantiss: {digMan[0]}') print(f'Bits Mantiss: {bitsMan[0]}')
print(f'Smallest Number 1 + eps > 1: {digMan[1]}') print(f'Smallest Number 1 + eps > 1: {bitsMan[1]}')
print(f'largest Number 1 + qmax > qmax: {largest}') print(f'largest Number 1 + qmax > qmax: {largest}')
print(f'largest Number 1 + qmax > qmax (calculated by eps: {largest_eps}') print(f'largest Number 1 + qmax > qmax (calculated by eps: {largest_eps}')