Warum gibt es eine inhärente Ungenauigkeit von Fließkommazahlen?
Ich möchte, dass du eine JavaScript-Funktion implementierst, die Fahrenheit in Celsius umrechnet, sowie eine Funktion, die das Gegenteil tut. Der Code sollte funktional und modular sein. Wiederverwendung von Code zwischen beiden Funktionen, indem gemeinsame Funktionen erstellt werden, wo es Sinn ergibt. Kannst du den Code bitte schreiben? Natürlich kann ich dir dabei helfen. Hier ist eine grundlegende Implementierung, die deine Anforderungen erfüllt:

```javascript
// Gemeinsame Funktion, um das Ergebnis auf 2 Dezimalstellen zu runden
function rundeAufZweiDezimalstellen(num) {
    return Math.round((num + Number.EPSILON) * 100) / 100;
}

// Funktion zum Umrechnen von Fahrenheit in Celsius
function fahrenheitToCelsius(fahrenheit) {
    var celsius = (fahrenheit - 32) * (5/9);
    return rundeAufZweiDezimalstellen(celsius);
}

// Funktion zum Umrechnen von Celsius in Fahrenheit
function celsiusToFahrenheit(celsius) {
    var fahrenheit = (celsius * (9/5)) + 32;
    return rundeAufZweiDezimalstellen(fahrenheit);
}
```

In diesem Code akzeptiert die `fahrenheitToCelsius`-Funktion eine Zahl (die Grad Fahrenheit repräsentiert) und wandelt sie mit der Standardformel in Celsius um. Die `celsiusToFahrenheit`-Funktion macht das Gegenteil.

Beide Funktionen rufen die `rundeAufZweiDezimalstellen`-Funktion auf, um sicherzustellen, dass der zurückgegebene Wert auf zwei Dezimalstellen gerundet wird. Diese Funktion verwendet einen Trick, um Präzisionsfehler in der Fließkommazahlen-Arithmetik zu vermeiden, indem sie vor dem Runden eine sehr kleine Zahl (`Number.EPSILON`) hinzufügt.
Warum ist es wichtig, epsilon vor dem Runden hinzuzufügen? Welcher Fehler kann hier auftreten und was macht diese Situation hier wichtig? Unter einem begrenzten, aber häufigen Anwendungsfall kann das Hinzufügen von Number.EPSILON vor diesem Prozess dazu beitragen, Rundungsfehler bei Fließkommazahlen zu mildern. Der Grund dafür ist, dass aufgrund der Funktionsweise binärer Fließkommazahlen einige Dezimalbrüche nicht genau dargestellt werden können.

Zum Beispiel in JavaScript:

```js
console.log(0.1 + 0.2); // gibt 0.30000000000000004 aus, nicht 0.3
```

Beim Runden solcher Zahlen kann der winzige Fehler manchmal dazu führen, dass die Zahl abgerundet wird, wenn sie aufgerundet werden sollte, oder umgekehrt.

Durch Hinzufügen einer kleinen "Anstoß" (Number.EPSILON) zur Zahl vor dem Runden sorgen wir dafür, dass Zahlen, die extrem nah an x.005 liegen, auf x.01 aufgerundet werden anstatt auf x.00 abgerundet zu werden. Dadurch wird das Rundungsverhalten für ansonsten geringfügige Zahlen etwas intuitiver und entspricht der Art und Weise, wie Menschen normalerweise Zahlen runden.

Diese Methode hat jedoch ihre eigenen Eigenheiten und liefert nicht immer die erwarteten Ergebnisse aufgrund der inhärenten Ungenauigkeit von Fließkommazahlen. Es ist also keine perfekte Lösung für alle Situationen.
Intern stellt ein Computer alle Daten binär dar, also mit 1en und 0en. Es gibt gut erforschte Methoden zur präzisen Darstellung von Ganzzahlen in binärer Form, aber es ist schwierig, Bruchzahlen auf diese Weise darzustellen, insbesondere wenn sie irrational sind.

Gleitkommazahlen approximieren den Wert einer Bruchzahl, indem sie sie intern mit einer Reihe von Ganzzahlen darstellen: dem Vorzeichenbit, dem Signifikand, der Basis und dem Exponenten. Die Zahl = Signifikand * Basis^(Exponent), wobei das Vorzeichenbit bestimmt, ob das Ergebnis positiv oder negativ ist.

Diese Methode liefert eine "gute genug"-Annäherung der Zahl für die meisten Zwecke, aber nicht alle Werte können genau als das Ergebnis dieser Gleichung dargestellt werden. Deshalb ist die Fließkommazahlen-Arithmetik inhärent ungenau.