Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| ef_informatik:zahlensysteme [2024-08-20 11:44] – [Dezimalzahlen mit Nachkommastellen] sca | ef_informatik:zahlensysteme [2024-08-27 12:40] (aktuell) – [Weitere Aufgaben] sps | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== - Zahlensysteme & Datentypen ====== | ====== - Zahlensysteme & Datentypen ====== | ||
| + | |||
| + | ++++Lernziele| | ||
| + | |||
| + | Grundsätzlich kann alles bis und mit Kapitel " | ||
| + | |||
| + | * Wissen, warum Datentypen wichtig sind in C Sprachen. | ||
| + | * Dynamische und statische Typisierung vergleichen. Vor- und Nachteile? | ||
| + | * Zahlen in wissenschaftlicher Schreibweise darstellen. | ||
| + | * Umwandlung von ganzen Zahlen (ints) dezimal <-> binär | ||
| + | * Binärzahl in Gleitkommadarstellung bringen ... | ||
| + | * ... und zugehörige Fachbegriffe (Mantisse, ...) erklären können. | ||
| + | * Umwandlung von Gleitkommazahlen dezimal <-> binär | ||
| + | * Umwandlung Gleitkommadarstellung in Binärzahl oder Dezimalzahl | ||
| + | * Sonderfälle für binäre Gleitkommazahlen kennen und verstehen. | ||
| + | * Binäre floats addieren können. | ||
| + | * Codes zu den obigen Punkten verfassen können in Python oder C#. | ||
| + | |||
| + | ++++ | ||
| + | |||
| + | ++++Praktische Python Befehle| | ||
| + | |||
| + | <code python> | ||
| + | # Length | ||
| + | len(" | ||
| + | |||
| + | # Data types | ||
| + | str(42) | ||
| + | int(" | ||
| + | float(13) | ||
| + | type(42) | ||
| + | bin(132) | ||
| + | |||
| + | # Strings | ||
| + | s = "ich bin ein String" | ||
| + | s[2:] | ||
| + | s[4:7] | ||
| + | s[:5] | ||
| + | s.replace(' | ||
| + | li = s.split(' | ||
| + | s.strip(" | ||
| + | s.lstrip(" | ||
| + | s.rstrip(" | ||
| + | s = s.upper() | ||
| + | s = s.lower() | ||
| + | s.find(" | ||
| + | many_zeros_string = " | ||
| + | |||
| + | ## TIPP: In diesem Thema bietet es sich meist an, mit Strings anstelle Listen zu arbeiten. Sollte man aber das Bedürfnis nach Listen haben, hier die wichtigsten Befehle: | ||
| + | li = [' | ||
| + | len(li) | ||
| + | li.append(' | ||
| + | li.pop(2) | ||
| + | li.remove(' | ||
| + | print(li) | ||
| + | </ | ||
| + | |||
| + | ++++ | ||
| ===== - Voraussetzungen ===== | ===== - Voraussetzungen ===== | ||
| Zeile 283: | Zeile 340: | ||
| <nodisp 1> | <nodisp 1> | ||
| ++++Lösung| | ++++Lösung| | ||
| + | |||
| + | <code python> | ||
| + | def binary_string_to_float(bin_str, | ||
| + | # SIGN | ||
| + | sign = ' | ||
| + | if bin_str[0] == ' | ||
| + | |||
| + | # SPECIAL CASE: ZERO | ||
| + | if ' | ||
| + | |||
| + | # TODO: other special cases (too small, too big, nan) | ||
| + | |||
| + | # if int convert into float | ||
| + | if not ' | ||
| + | |||
| + | # EXPONENT, MANTISSA | ||
| + | bin_str = bin_str.lstrip(' | ||
| + | bias = (2**len_exp - 2)//2 | ||
| + | mantissa = bin_str | ||
| + | |||
| + | # determine exponent | ||
| + | i_one = bin_str.find(' | ||
| + | i_point = bin_str.find(' | ||
| + | exponent = i_point - i_one | ||
| + | if exponent > 0: exponent -= 1 | ||
| + | |||
| + | # remove point from mantissa | ||
| + | if ' | ||
| + | |||
| + | # add bias to exponent | ||
| + | exp_w_bias = bin(exponent+bias)[2: | ||
| + | exp_w_bias = ' | ||
| + | if len(exp_w_bias) > len_exp: | ||
| + | return [sign,' | ||
| + | | ||
| + | # normalize mantissa | ||
| + | mantissa = mantissa.lstrip(' | ||
| + | mantissa_normalized = mantissa[1:: | ||
| + | # ensure mantissa has correct length | ||
| + | if len(mantissa_normalized) > len_mant: | ||
| + | mantissa_normalized = mantissa_normalized[0: | ||
| + | else: | ||
| + | mantissa_normalized += ' | ||
| + | |||
| + | # TODO: round mantissa correctly | ||
| + | | ||
| + | return [sign, | ||
| + | </ | ||
| + | |||
| ++++ | ++++ | ||
| </ | </ | ||
| Zeile 303: | Zeile 409: | ||
| * $42\_{10} = 101010\_2$ | * $42\_{10} = 101010\_2$ | ||
| - | * $0.375_{10} = 0.011$2 | + | * $0.375_{10} = 0.011\_2$ |
| Es gilt also $$42.375_{10} = 101010.011_2$$ | Es gilt also $$42.375_{10} = 101010.011_2$$ | ||
| Zeile 318: | Zeile 424: | ||
| 1. $0.0001\_2$ weil $\cfrac{1}{16} = 2^{-4}$ | 1. $0.0001\_2$ weil $\cfrac{1}{16} = 2^{-4}$ | ||
| - | 1. $0.1001_2$ | + | 1. $0.1001\_2$ |
| - | 1. $1011010.01_2$ | + | 1. $1011010.01\_2$ |
| - | 1. $.0110101110\ldots_2$ (geht noch weiter, nach 10 NKS abgebrochen) | + | 1. $.0110101110\ldots\_2$ (geht noch weiter, nach 10 NKS abgebrochen) |
| ++++ | ++++ | ||
| Zeile 351: | Zeile 457: | ||
| <box 100%> | <box 100%> | ||
| - | **Aufgabe:** Schreibe eine Funktion z.B. in Python, mit der man ... | + | <color magenta>**Programmieraufgabe:**</ |
| - | 1. Ganze Dezimalzahlen ins Binärsystem umrechnet. Repetition, implementiere selbst den Restwertalgorithmus und verwende nicht z.B. `bin(...)`. | + | 1. Ganze Dezimalzahlen ins Binärsystem umrechnet. Repetition, implementiere selbst den Restwertalgorithmus und verwende nicht z.B. `bin(...)`.\\ \\ |
| - | 1. Kleine Dezimalzahlen ($0 < a < 1$, haben also Form $0.< | + | 1. Kleine Dezimalzahlen ($0 < a < 1$, haben also Form $0.< |
| 1. Beliebige Dezimalzahlen, | 1. Beliebige Dezimalzahlen, | ||
| ++++Lösung| | ++++Lösung| | ||
| - | |||
| Zeile 364: | Zeile 469: | ||
| </ | </ | ||
| - | ===== Zusatzaufgaben | + | ===== Weitere Aufgaben |
| <box 100%> | <box 100%> | ||
| Zeile 465: | Zeile 570: | ||
| * Exponenten ermitteln | * Exponenten ermitteln | ||
| * Mantissen ermitteln | * Mantissen ermitteln | ||
| - | * Exponenten angleichen, Komma der Mantissen entsprechend verschieben. Bias beibehalten | + | * Exponenten angleichen, Komma der Mantissen entsprechend verschieben. Bias beibehalten. |
| * Addition durchführen | * Addition durchführen | ||
| * Komma verschieben, | * Komma verschieben, | ||
| Zeile 499: | Zeile 604: | ||
| **Aufgabe: | **Aufgabe: | ||
| - | 1. Bestimme die grösste und zweitgrösste Zahl, die man in einem C\#-Float (8-Bit Exponent, 23-Bit Mantisse). Verwende Python.\\ \\ | + | 1. Bestimme die grösste und zweitgrösste Zahl, die man in einem C\#-Float (8-Bit Exponent, 23-Bit Mantisse) |
| 1. Wie gross ist die Differenz? Verwende Python.\\ \\ | 1. Wie gross ist die Differenz? Verwende Python.\\ \\ | ||
| 1. Überzeuge dich davon, dass C\# nicht zwischen der grössten Zahl und zwischen einer Zahl, die in diesem Gap liegt, unterscheiden kann, zum Beispiel indem du diese von einander subtrahierst. Python hingegen hat da keine Probleme.\\ | 1. Überzeuge dich davon, dass C\# nicht zwischen der grössten Zahl und zwischen einer Zahl, die in diesem Gap liegt, unterscheiden kann, zum Beispiel indem du diese von einander subtrahierst. Python hingegen hat da keine Probleme.\\ | ||