maschinenzahlen ergaenzt

This commit is contained in:
Meik Hellmund 2024-04-07 23:16:33 +02:00
parent 5a1238d669
commit aa345eb7b1
2 changed files with 61 additions and 11 deletions

View File

@ -48,6 +48,7 @@ book:
- chapters/5_TricksHelp.qmd
- chapters/numerictypes.qmd
- chapters/Pi2.qmd
- chapters/types.qmd
- chapters/pcomplex.qmd
- chapters/9_functs.qmd
- chapters/6_ArraysEtcP1.qmd
@ -67,9 +68,10 @@ format:
dark: [superhero, css/dark.scss]
css:
- css/styles.css
# - css/fonts-HK.css
highlight-style: github # arrow ?????
mainfont: "Roboto Condensed" # Ubuntu # "Atkinson Hyperlegible" # Ubuntu # Verdana #Quicksand
mainfont: "Roboto Condensed" # Ubuntu # "Atkinson Hyperlegible" # Verdana #Quicksand
toc: true # change for Vorlesung
toc-depth: 3
number-depth: 3

View File

@ -57,6 +57,17 @@ $$
-9.223.372.036.854.775.808 \le x \le 9.223.372.036.854.775.807
$$
32-Bit-Integers haben den Wertebereich
$$
-2.147.483.648 \le x \le 2.147.483.647
$$
Der Maximalwert $2^{31}-1$ is zufällig gerade eine Mersenne-Primzahl:
```{julia}
using Primes
isprime(2^31-1)
```
Negative Zahlen werden im Zweierkomplement dargestellt:
$x \Rightarrow -x$ entspricht: _flip all bits, then add 1_
@ -86,7 +97,7 @@ Keine Fehlermeldung, keine Warnung! Ganzzahlen fester Länge liegen nicht auf ei
:::
Schauen wir uns ein paar *Integers* mal an:
Schauen wir uns ein paar *Integers* an:
```{julia}
@ -99,7 +110,7 @@ for i in (1, 2, 7, -7, 2^50, -1, Int16(7), Int8(7))
end
```
... und noch etwas mehr *introspection*:
Julia hat Funktionen, die über die Datentypen informieren (*introspection*):
```{julia}
@ -107,7 +118,7 @@ typemin(Int64), typemax(Int64)
```
```{julia}
typemin(UInt64), typemax(UInt64)
typemin(UInt64), typemax(UInt64), BigInt(typemax(UInt64))
```
```{julia}
@ -289,11 +300,21 @@ In der Numerischen Mathematik spricht man auch gerne von **Maschinenzahlen**.
### Grundidee
- Eine „feste Anzahl von Vor- und Nachkommastellen“ ist für viele Probleme ungeeignet.
- Eine Trennung zwischen „gültigen Ziffern“ und Größenordnung wie in der wissenschaftlichen Notation
- Eine Trennung zwischen „gültigen Ziffern“ und Größenordnung (Mantisse und Exponent) wie in der wissenschaftlichen Notation ist wesentlich flexibler.
$$ 345.2467 \times 10^3\qquad 34.52467\times 10^4\qquad \underline{3.452467\times 10^5}\qquad 0.3452467\times 10^6\qquad 0.03452467\times 10^7$$
ist wesentlich flexibler.
- Zur Eindeutigkeit legt man fest: Die Darstellung mit genau einer Ziffer vor dem Komma ist die __Normalisierte Darstellung__.
- Bei Binärzahlen `1.01101`: ist diese Ziffer immer gleich Eins und man kann auf das Abspeichern dieser Ziffer verzichten.
- Zur Eindeutigkeit muss man eine dieser Formen auswählen. In der mathematischen Analyse von Maschinenzahlen wählt man oft die Form, bei der die erste Nachkommastelle ungleich Null ist. Damit gilt für die Mantisse $m$:
$$
1 < m \le (0.1)_b = b^{-1},
$$
wobei $b$ die gewählte Basis des Zahlensystems bezeichnet.
- Wir wählen im Folgenden die Form, die der tatsächlichen Implementation auf dem Computer entspricht und legen fest:
Die Darstellung mit genau einer Ziffer ungleich Null vor dem Komma ist die __Normalisierte Darstellung__. Damit gilt
$$
b< m \le 1.
$$
- Bei Binärzahlen `1.01101`: ist diese Ziffer immer gleich Eins und man kann auf das Abspeichern dieser Ziffer verzichten. Diese tatsächlich abgespeicherte (gekürzte) Mantisse bezeichnen wir mit $M$, so dass
$$m = 1 + M$$
gilt.
:::{.callout-note }
@ -331,7 +352,7 @@ Der Standard IEEE 754, der von der Mahrzahl der modernen Prozessoren und Progra
- 11 Bits für den Exponenten, also $0\le E \le 2047$
- die Werte $E=0$ und $E=(11111111111)_2=2047$ sind reserviert für die Codierung von Spezialwerten wie
$\pm0, \pm\infty$, NaN _(Not a Number)_ und denormalisierte Zahlen.
- 52 Bits für die Mantisse $M,\quad 0\le M<1$, das entspricht etwa 16 Dezimalstellen
- 52 Bits für die (gekürzte) Mantisse $M,\quad 0\le M<1$, das entspricht etwa 16 Dezimalstellen
- Damit wird folgende Zahl dargestellt:
$$ x=(-1)^S \cdot(1+M)\cdot 2^{E-1023}$$
@ -395,10 +416,13 @@ printbitsf64(z)
```
## Maschinenepsilon
- Den Abstand zwischen `1` und dem Nachfolger `nextfloat(1)` nennt man [**Maschinenepsilon**](https://en.wikipedia.org/wiki/Machine_epsilon).
- Für `Float64` mit einer Mantissenlänge von 52 Bit, ist $\epsilon=2^{-52}$.
- Für `Float64` mit einer Mantissenlänge von 52 Bit ist $\epsilon=2^{-52}$.
```{julia}
@show nextfloat(1.) - 1 2^-52 eps(Float64);
@ -444,6 +468,19 @@ Eps
:::
:::{.callout-note}
## Die Menge der (normalisierten) Maschinenzahlen
- Im Intervall $[1,2)$ liegen $2^{52}$ äquidistante Maschinenzahlen.
- Danach erhöht sich der Exponent um 1 und die Mantisse $M$ wird auf 0 zurückgesetzt. Damit enthält das Intervall $[2,4)$ wiederum $2^{52}$ äquidistante Maschinenzahlen, ebenso das Intervall $[4,8)$ bis hin zu $[2^{1023}, 2^{1024})$.
- Ebenso liegen in den Intervallen $\ [\frac{1}{2},1), \ [\frac{1}{4},\frac{1}{2}),...$ je $2^{52}$ äquidistante Maschinenzahlen, bis hinunter zu $[2^{-1022}, 2^{-1021})$.
- Dies bildet die Menge $𝕄_+$ der positiven Maschinenzahlen und es ist
$$
𝕄 = -𝕄_+ \cup \{0\} \cup 𝕄_+
$$
:::
Die größte und die kleinste positive normalisiert darstellbare Gleitkommazahl eines Gleitkommatyps kann man abfragen:
```{julia}
@ -464,6 +501,11 @@ printbitsf64(floatmin(Float64))
- Standardrundungsregel: _round to nearest, ties to even_
Wenn man genau die Mitte zwischen zwei Maschinenzahlen trifft *(tie)*, wählt man die, deren letztes Mantissenbit 0 ist.
- Begründung: damit wird statistisch in 50% der Fälle auf- und in 50% der Fälle abgerundet und so ein „statistischer Drift“ bei längeren Rechnungen vermieden.
- Es gilt:
$$
\frac{|x-\text{rd}(x)|}{|x|} \le \frac{1}{2} \epsilon
$$
## Maschinenzahlarithmetik
@ -569,6 +611,9 @@ end
## Normalisierte und Denormalisierte Maschinenzahlen
Die Lücke zwischen Null und der kleinsten normalisierten Maschinenzahl $2^{-1022} \approx 2.22\times 10^{-308}$
ist mit denormalisierten Maschinenzahlen besiedelt.
Zum Verständnis nehmen wir ein einfaches Modell:
- Sei 𝕄(10,4,±5) die Menge der Maschinenzahlen zur Basis 10 mit 4 Mantissenstellen (eine vor dem Komma, 3 Nachkommastellen) und dem Exponentenbereich -5 ≤ E ≤ 5.
@ -605,7 +650,10 @@ end
## Spezielle Werte
Die Gleitkommaarithmetik kennt einige spezielle Werte:
Die Gleitkommaarithmetik kennt einige spezielle Werte, z.B.
```{julia}
nextfloat(floatmax(Float64))
```
```{julia}
for x ∈ (NaN, Inf, -Inf, -0.0)