Wertebereich und Genauigkeit der Zahlendarstellung

Ähnliche Dokumente
Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08

1. Referenzdatentypen: Felder und Strings

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

Physische Datenstrukturen

3. Datentypen, Ausdrücke und Operatoren

Einstieg in die Informatik mit Java

Programmierkurs C++ Variablen und Datentypen

9. Vektoren. (auch Felder/array)

Variablen, Konstanten und Datentypen

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Kapitel 05. Datentypen. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Modellierung und Programmierung 1

5.1 Mehr Basistypen. (Wie viele Werte kann man mit n Bit darstellen?)

3.8 Objekttypen und Arrays. Wir werden uns in diesem Kapitel näher mit den Objekttypen in Java beschäftigen.

Datenfelder (Arrays) Vektoren, Matrizen, Tabellen. Dr. Beatrice Amrhein

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

+ C - Array (Vektoren, Felder)

Programmieren I. Arrays Heusch 7.2 Ratz Institut für Angewandte Informatik

int i=1; //Integerzahl i anlegen und mit 1 initialisieren float wert; //Floatzahl deklarieren scanf( %f,&wert); //Wert über Tastatur eingeben

2. Programmierung in C

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

Programmieren I. Arrays Heusch 7.2 Ratz Institut für Angewandte Informatik

Elementare Datentypen in C++

Einstieg in die Informatik mit Java

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue

3.2 Datentypen und Methoden

Zeiger (engl. Pointer)

Viel Erfolg bei der Bearbeitung der Aufgaben!

2.1 Fundamentale Typen

VHDL - Objekte und Typen

8. Referenzen und Zeiger

F Zeiger, Felder und Strukturen in C

Einstieg in die Informatik mit Java

Kapitel 6. Programmierkurs. 6.0 Felder (Arrays) Deklaration von Feldern. Felder (Arrays) Mehrdimensionale Arrays. Birgit Engels, Anna Schulze WS 07/08

Programmieren in C/C++ und MATLAB

Java Datentypen und Variablen

Variablen. CoMa-Übung VIII TU Berlin. CoMa-Übung VIII (TU Berlin) Variablen / 15

Objekttypen. Referenzen, Objekte, Gleichheit, Wrapper, Arrays, mehr-dimensionale Arrays, Bildbearbeitung, krumme Arrays

Variablen und Konstanten

Zeiger: Der Adressoperator &

4.2 Programmiersprache C

Felder (1) Allgemeines

Kapitel 3. Grunddatentypen, Ausdrücke und Variable

7. Organisation von Informationen

Einstieg in die Informatik mit Java

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

C- Kurs 07 Höhere Datentypen

Ein String ist in Java eigentlich eine Klasse, wir können ihn aber zunächst als Datentyp betrachten, der zur Speicherung von Zeichenketten dient.

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Modul 122 VBA Scribt.docx

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

6. Zeiger Allgemeines Definition eines Zeigers

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Einführung in die Programmiersprache C

VHDL Objekte und Typen

Felder. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Übungspaket 23 Mehrdimensionale Arrays

Projekt 3 Variablen und Operatoren

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

4.2 Gleitkommazahlen. Der Speicherbedarf (in Bits) ist üblicherweise. In vielen Anwendungen benötigt man gebrochene Werte. Physikalische Größen

Primitive Datentypen und Felder (Arrays)

C-Grundlagen. zur Programmierung des MicroControllersystems MiCoWi

Tag 4 Repetitorium Informatik (Java)

float: Fließkommazahl nach IEEE 754 Standard mit 32 bit

Informatik I (D-MAVT)

Rechnen mit Java Ganze Zahlen Gebrochene Zahlen Fazit

Die einfachsten Anweisungen

Java I Vorlesung Imperatives Programmieren

Arrays,Strings&Pointer in C/C++

Unterprogramme, Pointer und die Übergabe von Arrays

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 3. Grunddatentypen, Ausdrücke und Variable

Zeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach 10.

Programmiertechnik Skalare Typen,Variablen, Zuweisungen

C-Pointer (Zeiger, Adressen) vs. C++ Referenzen

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Kapitel 3: Variablen

Übungspaket 23 Mehrdimensionale Arrays

WiMa-Praktikum 1. Woche 8

2.5 Primitive Datentypen

Übungspaket 14 Eindimensionale Arrays

3. Datentypen, Ausdrücke und Operatoren

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 1 - Variablen und Kontrollstrukturen

Programmierung mit C Zeiger

Vektoren 105. array-qualifier static restrict const volatile array-size-expression assignment-expression * simple-declarator identifier

WH: Arithmetik: Floating Point

Arrays. Einleitung. Deklarieren einer Array Variablen

Propädeutikum. Dipl.-Inf. Frank Güttler

Klausur. 2. Aufgabe (3 Punkte) Ergänzen Sie die leeren Zellen derart, dass sich in einer Zeile die selben Zahlenwerte ergeben.

Grundlagen der OO- Programmierung in C#

Java für Anfänger Teil 5: Basistypen 2. Programmierkurs Manfred Jackel

Name Klasse Datum. Um nun mit Variablen arbeiten zu können, müssen nun einige Voraussetzungen erfüllt sein:

Abschnitt 2: Daten und Algorithmen

Einstieg in die Informatik mit Java

2. Programmierung in C

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung

Vorlesung Programmieren

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Informatik I (D-ITET)

C-Programmierung: Ausdrücke und Operatoren#Division.2F

Transkript:

Wertebereich und Genauigkeit der Zahlendarstellung Sowohl F als auch C kennen bei ganzen und Floating Point-Zahlen Datentypen verschiedener Genauigkeit. Bei ganzen Zahlen, die stets exakt dargestellt werden und mit denen auch exakt gerechnet wird, betrifft das nur den möglichen Wertebereich. Je nachdem, wie viele Bytes an Speicherplatz für eine Variable reserviert sind, können darin nur ganze Zahlen bis zu einer bestimmten Maximalgröße untergebracht werden. Beim Standardtyp sind das derzeit meist 4 Bytes (32 Bits), was für ganze Zahlen einen Wertebereich von 2 31 = 2147483648 bis 2 31 1 = 2147483647 oder ca. ±2 10 9 ergibt (die genauen Grenzen hängen von den Details der Zahlendarstellung ab). Bei Floating Point-Zahlen wird der Speicherplatz pro Variable noch in Bereiche für die Darstellung des Exponenten und der Mantisse unterteilt. Wie groß diese Bereiche sind, ist implementationsabhängig, auf jeden Fall können darin aber wieder nur Exponenten beschränkter Größe bzw. Mantissen beschränkter Länge untergebracht werden. Bei Speicherung nach dem weitverbreiteten IEEE Standard ergeben sich für 4-Byte Floating Point-Variablen ein Zahlenbereich von etwa 10 37 bis 10 +37 und eine relative Genauigkeit von 6 Dezimalstellen. Da es einerseits wünschenswert sein mag, bei Programmen mit großem Speicherplatzbedarf den Speicherplatz pro Variable zu reduzieren, andererseits für numerisch heikle Anwendungen Wertebereich oder relative Genauigkeit der Standard-Datentypen nicht ausreichend sein können, kennt C u.a. die folgenden Datentypen für ganze char short int long bzw. Floating Point-Zahlen float double Dabei ist char zwar kein ganzzahliger Typ im engeren Sinn, definiert aber eine konkrete Speicherplatzgröße, nämlich eine 1-Byte Variable oder Konstante. Bei allen anderen Datentypen sind Speicherplatzbedarf und damit Wertebereich und/oder Genauigkeit implementationsabhängig. Um herauszufinden, wieviel Speicherplatz für eine Variable eines bestimmten Typs reserviert wird, kann man den sizeof-operator verwenden. sizeof(expression) liefert die Anzahl der Bytes, die zur Darstellung von expression verwendet werden, z.b. short i; printf("i occupies %d bytes\n",sizeof(i)); In gemischten numerischen Ausdrücken werden bei Bedarf Variablen oder Konstante einfacheren automatisch in solche komplizierteren Typs (also z.b. int in float) umgewandelt. Explizit kann man eine Konversion durch den Cast-Operator 1

(type)expression erzwingen. So haben im folgenden Beispiel beide Anweisungen denselben Effekt float x; x=1/3.0; x=1/((float)3); Die Definition numerischer Nicht-Standardtypen in F ist wesentlich portabler (wenn auch auf den ersten Blick etwas undurchsichtig). Dabei ist man von der Überlegung ausgegangen, daß es für numerisch anspruchsvolle Anwendungen nicht essentiell ist anzugeben, wie viele Bytes eine Variable belegen soll, sondern es ist viel wichtiger, für die Variablen maschinenunabhängig eine Minimalgenauigkeit bzw. einen minimalen Wertebereich verlangen zu können. Nur dadurch kann garantiert werden, daß eine umfangreichere Berechnung überhaupt zu einem sinnvollen Endergebnis führt. Die Definition von Nicht-Standardtypen erfolgt mit Hilfe des zusätzlichen Parameters kind bei der Variablendeklaration numeric type(kind=kind)::variable list kind kann nichtnegative ganzzahlige Werte annehmen, aber welche Werte erlaubt sind und was sie im einzelnen bedeuten, ist von Maschine zu Maschine verschieden. Um portable Programme zu schreiben, muß man daher zuerst herausfinden, welcher kind-wert die Minimalforderungen an Genauigkeit und/oder Wertebereich erfüllt. Dazu dienen die Funktionen selected_int_kind(range) selected_real_kind([precision][,range]) Dabei ist range der maximale dezimale Exponent der darzustellenden ganzen oder Floating Point-Zahlen und precision (nur bei Floating Point-Zahlen) die Anzahl der signifikanten dezimalen Stellen. (range=2 heißt also für ganze Zahlen, daß Werte von 100 bis +99 möglich sein sollen.) Diese Funktionen liefern den kind-wert des einfachsten Datentyps zurück, der den Anforderungen genügt, bzw., wenn ein solcher nicht existiert, einen negativen Wert. Die kind-werte dürfen allerdings nicht als Literals angegeben werden, sondern müssen benannte Konstante sein. Das folgende Beispiel zeigt die Deklaration von kurzen ganzzahligen Variablen mit Maximalwerten im Bereich ±1000 sowie reellen und komplexen Floating Point- Zahlen mit mindestens 12 Dezimalstellen Genauigkeit: integer,parameter::short=selected_int_kind(3) integer,parameter::double=selected_real_kind(12) integer(kind=short)::i real(kind=double)::x complex(kind=double)::z 2

Um umgekehrt herauszufinden, welche Eigenschaften der Datentyp eines Ausdrucks expression auf einer konkreten Maschine wirklich hat, stehen u.a. die Funktionen kind(expression) bit_size(expression) range(expression) precision(expression) huge(expression) kind-wert Anzahl der Bits in der Darstellung (ganzzahlig) dezimaler Exponentenbereich Anzahl signifikanter Dezimalstellen (Floating Point) größtmöglicher Wert zur Verfügung. Literals eines bestimmten Typs kennzeichnet man durch Anhängen des für den kind-wert gewählten Namens, z.b. mit den Definitionen des obigen Beispiels i=365_short x=0.123456789_double Bei expliziter Umwandlung eines Datentyps in einen anderen kann bei Konversionsfunktionen wie int oder real der kind-wert als optionaler weiterer Parameter in der Form int(expression[,[kind=]kind]) real(expression[,[kind=]kind]) angegeben werden. Mit den obigen Definitionen also z.b. Arrays i=int(365.0,kind=short) Grundlegendes Die bisher betrachteten Datentypen waren primitive, also in physikalisch-mathematischer Sprechweise skalare Objekte. Daneben gibt es in fast allen Programmiersprachen aber natürlich auch die Möglichkeit, höherdimensionale Objekte, also Vektoren, Matrizen usw. zu definieren. Der allgemeine Ausdruck dafür ist Arrays oder Felder. Die Deklaration, Darstellung und Verwendung von Arrays ist in F und C teilweise recht ähnlich, teilweise aber auch sehr verschieden. Zu den wesentlichen Unterschieden gehört einerseits, daß in F Arrays als eigene Objekte auch im ganzen angesprochen und manipuliert werden können (s. später). Im Gegensatz dazu kann man sich in C immer nur auf einzelne Elemente eines Arrays beziehen; es müssen also stets Indizes und Schleifen verwendet werden. Ein weiterer gravierender Unterschied besteht in der Form, in der mehrdimensionale Objekte gespeichert werden. Da praktisch alle Computer mit einem eindimensionalen Speichermodell arbeiten, müssen höherdimensionale Objekte auf irgendeine Weise auf einen eindimensionalen Adreßraum abgebildet werden. In F erfolgt das so, daß z.b. die Elemente einer Matrix a 1,1 a 1,2... a 1,n a 2,1 a 2,2... a 2,n...... a m,1 a m,2... a m,n 3

auf folgende Weise a 1,1 a 2,1... a m,1 a 1,2 a 2,2... a m,2... a 1,n a 2,n... a m,n also spaltenweise gespeichert werden. Im Gegensatz dazu werden in C Matrizen zeilenweise gespeichert, d.h. die Matrix wird im Speicher in der Form a 0,0 a 0,1... a 0,n 1 a 1,0 a 1,1... a 1,n 1...... a m 1,0 a m 1,1... a m 1,n 1 a 0,0 a 0,1... a 0,n 1 a 1,0 a 1,1... a 1,n 1... a m 1,0 a m 1,1... a m 1,n 1 abgebildet. Auf diesen Unterschied muß insbesondere Rücksicht genommen werden, wenn in einer aus F und C gemischten Anwendung Unterprogramme in F Arrays an Unterprogramme in C übergeben oder umgekehrt. Die Wahl der Indizes in den obigen Matrizen hat gleichzeitig noch einen weiteren Unterschied zwischen F und C illustriert: Während in F Array-Indizes beliebige Intervalle aus der Menge der ganzen Zahlen (also auch negative Werte) durchlaufen können, müssen in C Indizes stets mit 0 beginnen. Deklaration und Verwendung Es werden zunächst nur Arrays betrachtet, deren Größe zur Compilationszeit vorgegeben ist. Darüber hinaus können aber sowohl in F als in C Arrays auch zur Laufzeit dynamisch erzeugt werden. Arrays werden in F durch den dimension-parameter der Variablendeklaration definiert type,dimension(dim 1,dim 2,)::variable list wobei dim 1, dim 2,... die Indexbereiche der einzelnen Dimension des Arrays beschreiben und von der Form oder i min:i max i max sind. Der Index kann jeweils die Werte von i min bis i max bzw., wenn i min nicht angegeben ist, von 1 bis i max annehmen. Beispielsweise definiert real,dimension(10)::v real,dimension(10,20)::mat real,dimension(-3:6)::u 4

zwei Vektoren u und v mit je 10 Elementen und eine 10 20 Matrix mat. Bei u sind Indexwerte von 3 bis 6 vorgesehen, bei v von 1 bis 10; bei mat läuft der erste Index von 1 bis 10, der zweite von 1 bis 20. Die Deklaration von Arrays in C erfolgt durch Angabe der Anzahl der Elemente pro Dimension, dim, nach dem Variablennamen type name[dim 1][dim 2]; Der Index kann dann jeweils die Werte 0, 1,..., dim 1 annehmen. Die zu dem vorigen Beispiel analogen Deklarationen könnten also lauten float u[10],v[10]; float mat[10][20]; Arrays können wie skalare Variable auch bei der Deklaration mit Werten initialisiert werden. In F benützt man dazu einen speziellen Array-Konstruktor, der einen Vektor von Ausdrücken erzeugt, in C eine Liste. Wollte man z.b. einen (konstanten) Vektor primes mit den ersten fünf Primzahlen definieren und bei der Deklaration gleich initialisieren, so könnte das in F durch integer,dimension(5),parameter::primes=(/2,3,5,7,11/) geschehen und in C durch const int primes[5]={2,3,5,7,11}; Die zusätzlichen Modifikationen parameter bzw. const in diesem Beispiel besagen, daß es sich im speziellen Fall nicht um Arrays von Variablen, sondern von benannten Konstanten handeln soll. Bei der Verwendung von Array-Elementen in numerischen Ausdrücken sowie auf der linken Seite von Zuweisungen, d.h. überall, wo auch skalare Variable stehen könnten, werden der oder die entsprechenden Indizes in runden (F) bzw. eckigen [C] Klammern angegeben. Zum Beispiel in F integer i,j real,dimension(10)::u,v real,dimension(10,20)::mat mat(1,1)=0.0 u(i)=mat(i,2*j+1)*v(j)+1.0 und ähnlich in C 5

int i,j; float u[10],v[10]; float mat[10][20]; mat[0][0]=0.0; u[i]=mat[i][2*j+1]*v[j]+1.0; 6