Numerische Methoden und Algorithmen in der Physik Hartmut Stadie, Christian Autermann 30.10.2008 Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 1/ 48
Einführung Datentypen Operatoren Anweisungssyntax Zurück zum Beispiel Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 2/ 48
Übersicht Einführung Informationen Aufgabe: Berechne exp(x) Beispiel Progammierparadigmen Datentypen Operatoren Anweisungssyntax Zurück zum Beispiel Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 3/ 48
Informationen Ablauf: Vorlesung: donnerstags 8:30 Hörsaal, Geb. 61, DESY Übung: im Anschluss an die Vorlesung Material: Stroustrup: The C++ Programming Language, 3rd edition http://www.mathematik.uni-marburg.de/ cpp/ Press et al: Numerical Recipes, 3rd edition http://wwwiexp.desy.de/studium/lehre/numalg/ Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 4/ 48
Ein Beispiel: exp(x) Aufgabe: Berechne Kosinus von x: exp(x) = n=0 x n n! exp(x) 1 + x + x 2 2 + x 3 6 +... exp(x) 1 + 1 x 1 + x x 2 +... Pseudocode: expox = 1 summand = 1 wiederhole von n = 1 bis N summand = summand * x / n expox = expox + summand Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 5/ 48
Beispiel 1. C++-Programm moin.cxx: #include <iostream> //Kommentar /* Kommentar 2 */ int main() { std::cout << "Moin, moin!\n"; } Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 6/ 48
Programmierprojektstruktur Dateitypen: Quellcode:.cc,.hh kompilierter Code (object file) Bibliothek (library) Sammlung von Programmfunktionen für zusammengehörende Aufgaben ausführbare Datei (executable) Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 7/ 48
Kompilieren, Linken, Ausführen bash-2.05b$ g++ -c moin.cxx bash-2.05b$ g++ -o moin moin.o bash-2.05b$./moin Moin, moin! Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 8/ 48
Was ist C++ besser als C unterstützt imperative Programmierung strukturierte Programmierung prozedurale Programmierung modulare Programmierung Datenabstraktion Objektorientierung generische Programmierung Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 9/ 48
Imperative Programmierung Ansatz: Programm ist lineare Folge von Befehlen. Befehle modifizieren Speicherbereiche (Daten) oder Speichermedien. char data[200]; int index = -1; ++index; data[index] = d ; ++index; data[index] = o ; char c = data[index]; --index; Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 10/ 48
Strukturierte Programmierung Ansatz: Benutze Kontrollstrukturen anstelle von Sprunganweisungen. for(int i = 0 ; i <= index ; ++i) { std::cout << data[i]; } if(data[index] == # ) {... } Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 11/ 48
Prozedurale Programmierung Ansatz: divide et impera Zerteile Problem in (einfachere) einzelne Funktionen. Verwende die bestmöglichen Algorithmen. void push(char c) { ++index;data[index] = c; } char pop() { char c = data[index]; --index; return c; } int main() { push( d );push( o ); char c = pop(); } Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 12/ 48
Ansatz: Datenabstraktion divide et impera Entscheide welche Datentypen gebraucht werden, implementiere die notwendigen Operationen class Stack { public: void push(char c); char pop(); private: char data[200]; }; int main() { Stack s,t; s.push( d ); t.push( o ); char c = s.pop(); }; Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 13/ 48
Objektorientierung Ansatz: Klassen sind instanziierbare Module und Grundelemente in der Programmierung. Objekte werden mit Daten und den darauf arbeitenden Routinen zu Einheiten zusammengefasst. Pogramm ist eine Menge interagierender Objekte. Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 14/ 48
Übersicht Einführung Datentypen Deklarationen Elementare Datentypen Boolean Zeichentypen Integertypen Gleitkommatypen Void Definition Zuweisung Zusammengesetzte Typen Operatoren Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 15/ 48
Deklaration Deklaration Zuordnung: Variablenname -> Typ, Qualifier; Variablenname: beginnt mit Buchstabe/_ kann Zahlen und Buchstaben/_ enthalten keine Schlüsselwörter Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 16/ 48
Elementare Datentypen: Boolean Werte: wahr(1) oder falsch(0) bool b = true; bool a = 99; bool c = 0; //false Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 17/ 48
Elementare Datentypen: Zeichentypen Werte: 1 Zeichen char c = v ; Größe: 1 Byte = 8 Bit : 0-255 Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 18/ 48
Elementare Datentypen: Integertypen Werte: ganze Zahlen int a = 13; short int sg = 235; long int b= -1; int h = 0xa4;//hexadecimal 164 int o = 023;//octal 19 long l = 95L; unsigned int a; unsigned long b; signed int c;// int; Größen: 1 = sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) Linux PC: int,long (4 Byte): - 2.147.483.648 bis 2.147.483.647 Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 19/ 48
Elementare Datentypen: Gleitkommatypen Werte: reelle Zahlen x = s m b E e Beispiel: 3, 034359 10 3 float x = 13.5; float x2 = 9; float x3 = 9f; double y = -232313.5; long double l = 25235.346143674; IEEE Standard: b = 2, s mit 1 Bit Typ Größe E e m float 4 Byte 8 Bit(256) 127 23 Bit(8.388.608) double 8 Byte 11 Bit(2.048) 1023 52 Bit(4.5 10 15 ) Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 20/ 48
Elementare Datentypen: void Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 21/ 48
Deklaration und Definition Deklaration meistens auch Definition Ausnahmen: float exp(float x); extern int a; struct A; class B; Definition: deklariere Namen und reserviere Speicher Deklaration: deklariere Namen (Speicher an anderer Stelle im Code schon reserviert) Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 22/ 48
Zuweisung und Konstanten int a;//deklaration und Definition a = 4567;//Zuweisung c = b = a; //rechts-assoziativ, zuerst b = a const int d = 8; d = 5; //!!! falsch Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 23/ 48
Übersicht Einführung Datentypen Operatoren Assoziation Reihenfolge Anweisungssyntax Zurück zum Beispiel Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 24/ 48
Operatoren Operatoren sind dabei Symbole für mathematische Operationen (inklusive logischer Operationen) werden auf Variablen angewendet. Beispiel: double y = 2; double x = - 3 * sqrt(4) + 42 + y++ - --y;; Welche Reichenfolge???? Priorität Assoziation Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 25/ 48
Assoziation Welcher Teilausdruck zuerst???? rechts: einstellige Operatoren, Zuweisungen links: zweistellige Operatoren Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 26/ 48
Priorität Geltungsbereich(scope) :: //Beispiel int a = 9; int main() { int a = 7; std::cout << ::a << a; //97 } Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 27/ 48
Member,Funktionsaufruf, Postincrement obj.member pointer->member pointer[expr] expr(expr_list) value(expr_list)//value construction lvalue++ lvalue-- casts Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 28/ 48
Preincrement,... sizeof ++lvalue --lvalue ~expr!expr -expr +expr &lvalue *expr new delete (type)expr Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 29/ 48
Multiplikation expr * expr expr / expr expr % expr Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 30/ 48
Summation expr + expr expr - expr Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 31/ 48
Schieben expr << expr expr >> expr Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 32/ 48
Vergleiche expr < expr expr <= expr expr > expr expr >= expr expr == expr expr!= expr expr && expr expr expr expr? expr : expr int a = (b > 0)? 1 : 1 Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 33/ 48
Zuweisungen lvalue = expr lvalue *= expr lvalue /= expr lvalue %= expr lvalue += expr lvalue -= expr Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 34/ 48
Übersicht Einführung Datentypen Operatoren Anweisungssyntax Deklaration Ausdruck Anweisungsblock Auswahlanweisungen Schleifen Sprunganweisungen Switch-Anweisung Bedingung Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 35/ 48
Ausdruck mit Semikolon!!! a = 8; std::cout << a; d = exp(6); Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 36/ 48
Anweisungsblock { statement statement...} Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 37/ 48
Auswahlanweisungen if( condition) statement if( condition) statement else statement //switch ( condition ) statement Beispiel: if( x > y ) { std::cout << "x ist groesser\n"; } else if( x < y ) { std::cout << "y ist groesser\n"; } else { std::cout << "x ist gleich y\n"; } Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 38/ 48
Schleifen while( condition ) statement do statement while ( expression ) ; for( for-init-statement condition ; expression ) statement Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 39/ 48
Schleifen: Beispiel int i = 0; while (i < 10) { std::cout << i << ; ++i; } mit for: for(int i = 0 ; i < 10 ; ++i) { std::cout << i << ; } Kleinerer Geltungsbereich Regel: Minimiere den Geltungsbereich von Variablen Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 40/ 48
Sprunganweisungen break; //verlasse Schleife, Block continue;//naechste Iteration return expr;//verlasse Funktion for(int i = 0 ; i < 10 ; ++i) { if( i == 2 ) continue; std::cout << i << ; } Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 41/ 48
Vergleich mit Konstanten char eingabe; bool yes; switch(eingabe) { case j : yes = true; case y : yes = true; case n : yes = false; default: yes = false; } nur Sprungziel break fehlt im Beispiel! Switch-Anweisung Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 42/ 48
Bedingung Bedingung (condition): Ausdruck (expr) Deklaration und Zuweisung if(int summe = a + b) { std::cout << summe << \n ; } else { std::cout << "a + b sind null\n"; } Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 43/ 48
Übersicht Einführung Datentypen Operatoren Anweisungssyntax Zurück zum Beispiel Code Genauigkeit Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 44/ 48
Zurück zum Beispiel double erg = 1; double summand = 1; for(int i = 1 ; i < 100 ; ++i) { summand *= x/i; erg += summand; } Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 45/ 48
Elementare Datentypen: Gleitkommatypen Werte: reelle Zahlen x = s m b E e Beispiel: 3, 034359 10 3 float x = 13.5; float x2 = 9; float x3 = 9f; double y = -232313.5; long double l = 25235.346143674; IEEE Standard: b = 2, s mit 1 Bit Typ Größe E e m float 4 Byte 8 Bit(256) 127 23 Bit(8.388.608) double 8 Byte 11 Bit(2.048) 1023 52 Bit(4.5 10 15 ) Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 46/ 48
Gleitkommaarithmetik Probleme der Gleitkommaarithmetik Rundungsfehler bei Subtraktion ähnlich großer Zahlen Addition von Zahlen verschiedener Größenordnung daher Assoziativgesetz und Distributivgesetz ungültig Fehler durch Abbruch der Rechnung z.b. nur die ersten 30 Summanden einer Reihe Genauigkeit der Darstellung: in limits: std::numeric_limits<float>::min() std::numeric_limits<float>::max() std::numeric_limits<float>::epsilon() Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 47/ 48
Gleitkommaarithmetik #include <iostream> #include <limits> int main() { std::cout.precision(16); std::cout << "epsilon float:" << std::numeric_limits<float>::epsilon() << " 1/epsilon:" << 1/std::numeric_limits<float>::epsilon() << std::endl; float x = 1192090; float oldx = 0; while(x!= oldx) { oldx = x; x = x + 1; } std::cout << "x for float:" << x << \n ; } Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 48/ 48