Pascal Schärli 15.03.2019
Pascal Schärli 15.03.2019
Pascal Schärli 15.03.2019
8 > 4 > 2 > 1
((8 > 4) > 2) > 1
( true > 2) > 1
( 1 > 2) > 1
false > 1
0 > 1
false
Pascal Schärli 15.03.2019
2 < a < 4
(2 < a) < 4
true < 4
1 < 4
false < 4
0 < 4
true
Pascal Schärli 15.03.2019
Vergleich
==
Zuweisung
=
int a;
int b = 5;
a = b;
a = 7;
if(a==b){
//...
}
Beispiel:
Beispiel:
Pascal Schärli 15.03.2019
a == false || b == true)
!a || b
Pascal Schärli 15.03.2019
#include <iostream>
int main(){
int n;
std::cin >> n;
for(int i = 0; i < n; i++){
if(i % 2 == 0){
std::cout << i / 2 << std::endl;
}
else{
std::cout << i * 2 << std::endl;
}
}
return 0;
}
#include <iostream>
int main(){
int n;
std::cin >> n; for(int i = 0; i < n; i++)
if(i % 2 == 0)
std::cout << i / 2 << std::endl;
else
std::cout << i * 2 << std::endl;
return 0;}
Pascal Schärli 15.03.2019
Pascal Schärli 15.03.2019
Expression | Dezimal | Binär |
---|---|---|
a | ||
b | ||
a + b |
4
7
11
0b100
0b111
0b1011
Pascal Schärli 15.03.2019
ab.cd => 2*a + 1*b + 1/2 * c + 1/4 * d
00.00 => 0
00.01 => 1/4
00.10 => 1/2
00.11 => 3/4
01.00 => 1
01.01 => 1 + 1/4
01.10 => 1 + 1/2
01.11 => 1 + 3/4
10.00 => 2
10.01 => 2 + 1/4
10.10 => 2 + 1/2
10.11 => 2 + 3/4
11.00 => 3
11.01 => 3 + 1/4
11.10 => 3 + 1/2
11.11 => 3 + 3/4
Pascal Schärli 15.03.2019
Pascal Schärli 15.03.2019
Warum kann man 0.1 als Binärzahl nicht endlich darstellen, aber als Dezimalzahl schon?
Â
Â
Pascal Schärli 15.03.2019
Berechne die Binärdarstellung der folgenden Dezimalzahlen:
0.25
11.1
0.01
1011.00011
Algorithmus:
\(b_i \rightarrow\) Binärziffer
\(x_i \rightarrow \) Dezimalzahl
Zuerst binärzahl vor Komma normal ausrechnen.
Danach folgende Schritte wiederholen:
Pascal Schärli 15.03.2019
\(p \rightarrow\) Anzah Ziffern
(Basis des Zahlensystems)
(Bereich für Exponent)
(Normalisiert)
Pascal Schärli 15.03.2019
Sind diese Zahlen sind im folgenden Zahlensystem enthalten: \(F^* (2, 4, -2 , 2 )\)?
1.000 * 2^1
1.001 * 2^-1
1.111 * 2^2
0.000 * 2^1
1.0001 * 2^-1
1.111 * 2^5
normalisiert \(\rightarrow \) Zahl startet nicht mit 0
zu viele Nachkommastellen
Exponent ist nicht zwischen \(-2\) und \(2\).
Pascal Schärli 15.03.2019
Was sind die folgenden Zahlen in \(F^* (2, 4, -2 , 2 )\)?
die kleinste nicht-negative.
die grösste
die kleinste
1.111 * 2^2 -> 7.5
-1.111 * 2^2 -> -7.5
1.000 * 2^-2 -> 0.25
Pascal Schärli 15.03.2019
Wie kann man Zahlen in einem FP-System addieren?
Â
Â
Â
Â
Pascal Schärli 15.03.2019
Algorithmus:
1.001 * 2^-1 + 1.111 * 2^-2
1.001 * 2^-1
+ 0.1111 * 2^-1
1.001 * 2^-1
+ 0.1111 * 2^-1
-----------------
= 10.0001 * 2^-1
1.001 * 2^-1
+ 0.1111 * 2^-1
-----------------
= 10.0001 * 2^-1
= 1.00001 * 2^0
1.001 * 2^-1
+ 0.1111 * 2^-1
-----------------
= 10.0001 * 2^-1
= 1.00001 * 2^0
=> 1.000 * 2^0
Algorithmus:
Algorithmus:
Algorithmus:
Algorithmus:
\(\rightarrow\) Resultat: \(1\) (Exakt: \(1.03125\))
\(F^* (2, 4, -2 , 2 )\)
Pascal Schärli 15.03.2019
Wir haben \(10\) Bits zur Verfügung. Wie können wir damit einen eigenen Fliesskomma-Datentyp erstellen?
Pascal Schärli 15.03.2019
X
X
X
X
X
X
X
X
X
X
0
1
2
3
4
5
6
7
8
9
Zahl vor dem Komma
Nachkomma Stellen
Exponent
Versuch 1
Wir versuchen die Wissenschaftliche Notation (e.g. \(2.73\cdot 10^{12}\)) zu imitieren
Einige Zahlen in unserem Sytem:
Pascal Schärli 15.03.2019
X
X
X
X
X
X
X
X
X
X
0
1
2
3
4
5
6
7
8
9
Vorzeichen
Nachkomma Stellen
Exponent
Versuch 2
Wir klassifizieren unser System als \(F^* (b, p, e_{min} , e_{max} )\) System. Da das erste Bit immer 1 ist, verwenden wir es als Vorzeichen.
Einige Zahlen in unserem Sytem:
Pascal Schärli 15.03.2019
X
X
X
X
X
X
X
X
X
X
0
1
2
3
4
5
6
7
8
9
Vorzeichen
Nachkomma Stellen
Exponent
Versuch 3
Um Fliesskommazahlen zu Erhalten müssen wir negative Nachkommazahlen haben. Wir ziehen daher dem Exponent jeweils 8 ab.
Einige Zahlen in unserem Sytem:
Pascal Schärli 15.03.2019
X
X
X
X
X
X
X
X
X
X
0
1
2
3
4
5
6
7
8
9
Vorzeichen
Nachkomma Stellen
Exponent
Versuch 4
Es gibt keine 0 in unserem System! Wir definieren also, dass wir beim Exponent \(-8\) eine Spezielle Zahl haben.
Einige Zahlen in unserem Sytem:
Bits 1-5:
Pascal Schärli 15.03.2019
float a = 0.2f;
if (10*a == 2.0f){
std::cout << "Equal" << std::endl;
}
else{
std::cout << "Not Equal" << std::endl;
}
Not Equal
«Prüft nie ob zwei Fliesskommazahlen gleich sind, wenn mindestens eine vorher gerundet wurde!»
Pascal Schärli 15.03.2019
float a = 67108864.0f + 1.0f;
if (a > 67108864.0f){
std::cout << "Greater" << std::endl;
}
else{
std::cout << "Not Greater" << std::endl;
}
Not Greater
«Vermeidet die Addition von Zahlen mit extremen Unterschieden in der Grösse!»
Â
(Rundungsfehler)
67108864 =
+1 =
67108864 = 1.000000000000000000000000 * 2^26
+1 = 0.00000000000000000000000001 * 2^26
67108864 = 1.000000000000000000000000 * 2^26
+1 = 0.00000000000000000000000001 * 2^26
-----------------------------------------------
= 67108865 = 1.00000000000000000000000001 * 2^26
67108864 = 1.000000000000000000000000 * 2^26
+1 = 0.00000000000000000000000001 * 2^26
-----------------------------------------------
= 67108865 = 1.00000000000000000000000001 * 2^26
=> 67108864 = 1.000000000000000000000000 * 2^26
Pascal Schärli 15.03.2019
float a = .2f;
for(int i = 0; i < 20; i++){
a = 6*a - 1;
std::cout << a << std::endl;
}
0.2
0.2
0.200002
0.20001
0.200062
0.200371
0.202225
0.213348
0.28009
0.680542
3.08325
«Vermeidet die Subtraktion von Zahlen mit ähnlicher Grösse»
Â
(Rundungsfehler)
Pascal Schärli 15.03.2019
Schreibe ein Programm, welches für drei Zaheln a, b und c die Summe a! + b! + c! zurückgibt.
Â
unsigned int a,b,c;
std::cin >> a >> b >> c;
unsigned int a_fact = 1;
for(int i = 1; i <= a; i++){
a_fact *= i;
}
unsigned int b_fact = 1;
for(int i = 1; i <= b; i++){
b_fact *= i;
}
unsigned int c_fact = 1;
for(int i = 1; i <= c; i++){
c_fact *= i;
}
std::cout << a_fact + b_fact + c_fact << std::endl;
Pascal Schärli 15.03.2019
Wie können wir verhindern, immer wieder den selben Code zu kopieren?
Â
#include <iostream>
unsigned int fact(unsigned int n){
unsigned int out = 1;
for(int i = 0; i < n; i++){
out *= i;
}
return out;
}
int main(){
unsigned int a,b,c;
std::cin >> a >> b >> c;
std::cout << fact(a) + fact(b) + fact(c) << std::endl;
return 0;
}
Pascal Schärli 15.03.2019
Eine Funktion hat die folgenden Komponenten:
int foo(int a, float b, bool c){
if(c){
a += b;
}
else{
a-=b;
}
return a;
}
Datentyp vom Rückgabewert
Name der Funktion
Beliebig viele Übergabewerte
Funktions-Körper (Berechnung)
Rückgabe des Resultats
Pascal Schärli 15.03.2019
isPrime(n);{
for(unsigned int i == 2; i < n/2, i+1){
if(n % i = 0){
return false
}
}
}
bool isPrime(unsigned int n){
for(unsigned int i = 2; i <= n/2; i++){
if(n % i == 0){
return false;
}
}
return true;
}
Findet die 10 Fehler!
Pascal Schärli 15.03.2019
bool inInterval(double x, double left, double right){
return x >= left && x <= right;
}
Precondition:
Â
//PRE: left <= right
//POST: returns true iff x is in the Interval [left, right]
bool inInterval(double x, double left, double right){
return x >= left && x <= right;
}
Postcondition:
Pascal Schärli 15.03.2019
Pascal Schärli 15.03.2019
Gegeben ein binäres Float-System:
Â
Tipp:
Normalisiert \(\rightarrow\) Zahl vor Komma darf nicht 0 sein!
Pascal Schärli 15.03.2019
Schreibt ein Programm, welches bestimmt ob ein Punkt \((x, y)\) auf der Parabel \(g(x) = 0.9 \cdot x^2 + 1.3 \cdot x - 0.7\) liegt
Tipps:
Pascal Schärli 15.03.2019
Schreibt eine Funktion, welche einen double auf den nächsten Integer runden kann.
Tipp:
Schreibt ein Programm, welches ein x mit \(0 \le x \le 2 \) als Binärzahl im folgenden Format schreiben kann: \(b_0.b_1b_2b_3...b_{15}\)
Tipp:
Wendet diesen Algorithmus an:
Pascal Schärli 15.03.2019
Pascal Schärli 15.03.2019
bool is_even (unsigned int i) {
if (i % 2 == 0) return true;
}
double invert (double x) {
double result;
if (x != 0)
result = 1 / x;
return result;
}
Behebe alle Probleme welche diese Funktionen haben und füge passende pre- und post conditions.
Tipp:
Pascal Schärli 15.03.2019
Pascal Schärli 15.03.2019