P1-WS04-MusterLoesung08.txt: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
fsrwiki_>1illig K (antispam) |
fsrwiki_>Oddmuse Import K (link fix) |
||
Zeile 72: | Zeile 72: | ||
+#.# | +#.# | ||
DrScheme: | [[DrScheme]]: | ||
> (/ 1 0) | > (/ 1 0) | ||
Zeile 94: | Zeile 94: | ||
2.5 | 2.5 | ||
DrScheme: | [[DrScheme]]: | ||
> (+ 2 (- (/ 6 4) 1)) | > (+ 2 (- (/ 6 4) 1)) | ||
Zeile 120: | Zeile 120: | ||
14154208231265997.0 | 14154208231265997.0 | ||
DrScheme: | [[DrScheme]]: | ||
> (/ (- 2 | > (/ (- 2 |
Version vom 5. November 2007, 07:49 Uhr
P1 Übungen WS2004/2005 Musterlösung 8 (Martin Burmester) Aufgabe 1.) Praefixnotation bedeutet, dass der Operator oder die Funktion vor den Argumenten steht, bei Infixnotation steht der Operator zwischen den Argumenten. Die Praefixnotation scheint zunächst einmal gewisse Nachteile gegenüber der Infixnotation zu haben: Es ist sehr ungewohnt, Terme auf diese Weise zu schreiben; deshalb geht beim Lesen und Schreiben zunächst einmal die Übersicht verloren. Dennoch hat die Präfixnotation bei genauerem Hinsehen einige Vorteile: Die "Operatoren" +, -, * und /, aber auch z.B. ** bzw. ^ werden hier in ganz normaler Funktionsnotation geschrieben. Damit gibt es keinen (künstlichen) Unterschied zwischen "Funktionen" und "Operatoren" mehr. Es hat aber auch den Vorteil, dass beliebig viele Argumente übergeben werden können und so auch die mathematischen Operationen nicht auf Zweistelligkeit beschränkt sind. Schliesslich bräuchte man keine Regeln, um die Bindungsstärke der Operatoren zu beschreiben, denn alle Funktionen sind gleichberechtigt. Für Informatiker gibt es noch einen weiteren Vorteil: Terme in Präfixnotation lassen sich einfacher verarbeiten, da sie sich direkt als Baum darstellen lassen: 2 + 3 * 4 + 1 = (+ 2 (* 3 4 ) 1) + /|\ / | \ 2 * 1 / \ / \ 3 4 In Scheme wird Praefixnotation verwendet. Aufgabe 2.) a) (+ 4 4 4 4) => 16 erwartungsgemäß b) (/ (/ (sin 1) (cos 1)) (tan 1)) => 0.9999999999999999 Scheme arbeitet mit beschränkter Genauigkeit. Des weiteren führt Scheme keine algebraischen Umformungen durch[1] sondern wertet die einzelnen Funktionsaufrufe nacheinander numerisch aus. [1] Mit sin x / cos x = tan x liesse sich der Term zu tan 1 / tan 1 umformen, und anschließend um tan 1 kürzen, so dass als Ergebniss 1 bleibt. c) SCM-Scheme: > (/ 1 0) +#.# [[DrScheme]]: > (/ 1 0) [Käfer] /: division by zero MIT-Scheme: 1 ]=> (/ 1 0) ;Division by zero signalled by /. ;To continue, call RESTART with an option number: ; (RESTART 1) => Return to read-eval-print level 1. Die Division durch 0 ist auch in Scheme nicht definiert. Aufgabe 3.) SCM-Scheme: > (+ 2 (- (/ 6 4) 1)) 2.5 [[DrScheme]]: > (+ 2 (- (/ 6 4) 1)) 2 1/2 MIT-Scheme: 1 ]=> (+ 2 (- (/ 6 4) 1)) ;Value: 5/2 Der revised^5 report schreibt nicht vor, dass alle dort beschriebenen Zahlentypen implementiert werden müssen. b) SCM-Scheme: > (/ (- 2 > (/ (+ 2 2) > (+ 3 > (* 3 4)))) > (sin (sin pi))) 14154208231265997.0 [[DrScheme]]: > (/ (- 2 (/ (+ 2 2) (+ 3 (* 3 4)))) (sin (sin pi))) 14154208231265998.0 MIT-Scheme: 1 ]=> (/ (- 2 (/ (+ 2 2) (+ 3 (* 3 4)))) (sin (sin pi))) ;Unbound variable: pi ;To continue, call RESTART with an option number: ; (RESTART 3) => Specify a value to use instead of pi. ; (RESTART 2) => Define pi to a given value. ; (RESTART 1) => Return to read-eval-print level 1. Der revised^5 report schreibt nicht vor, dass die Konstante pi vordefiniert sein muss. Eigentlich waere hier ein Division durch 0 Fehler zu erwarten, da sin pi = 0 und sin 0 = 0, in SCM-Scheme ist aber: > (sin pi) 1.2246467991473533e-16 > (sin (sin pi)) 1.2246467991473533e-16 Da der Wert der PI Konstante nur eine Naeherung ist und auch die sin Funktion nur naeherungsweise den Funktionswert der Sinusfunktion berrechnet (etwa ueber eine Taylorreihe). Aufgabe 4.) > (* 2000 (/ 4 100)) 80