C-Programmierung: Schleifen und Gleitkommagenauigkeit in Konvertierungstabellen korrigieren

10

Das Schreiben eines einfachen Temperaturkonverters klingt trivial, bis man erkennt, wie leicht die grundlegende Logik kaputt geht. Sie beginnen mit einer „while“-Schleife, erstellen eine Fahrenheit-zu-Celsius-Tabelle und alles scheint in Ordnung zu sein. Aber dann benötigen Sie einen bestimmten Datenpunkt – wie die menschliche Körpertemperatur – und plötzlich wird Ihr sauberer Code zu einem Debugging-Albtraum.

Hier erfahren Sie aus der Praxis, wie Schleifen in C funktionieren, warum Präzision wichtig ist und wie Sie verhindern, dass Ihre Programme für immer hängen bleiben.

Die Grundlagen: Ganzzahlschleifen

Schauen wir uns die einfachste mögliche Version an. Sie möchten eine Tabelle von 0 bis 100 Grad Fahrenheit in 10-Sekunden-Schritten drucken. Sie verwenden eine Ganzzahl „int“ für den Zähler „a“.

„c

int main() {
int a;
a = 0;
while (a <= 100) { printf("%4d Grad F = %4d Grad C\n", a, (a - 32) * 5 / 9); a = a + 10; } 0 zurückgeben; } „

Führen Sie Folgendes aus, und Sie erhalten ein sauberes Raster:

„Text
0 Grad F = -17 Grad C
10 Grad F = -12 Grad C
20 Grad F = -6 Grad C
30 Grad F = -1 Grad C
40 Grad F = 4 Grad C
50 Grad F = 10 Grad C
60 Grad F = 15 Grad C
70 Grad F = 21 Grad C
80 Grad F = 26 Grad C
90 Grad F = 32 Grad C
100 Grad F = 37 Grad C

Es ist funktional. Es ist schnell. Aber es ist hässlich. Warum? Weil die Ganzzahldivision Dezimalzahlen abschneidet. „(a – 32) * 5 / 9“ löscht den Bruchteil vor dem Drucken. Wenn Sie Genauigkeit benötigen, benötigen Sie Gleitkommazahlen.

Gleitkomma-Präzision

Der Wechsel zu „float“ ändert die Mathematik. Sie müssen auch den Formatbezeichner von „%d“ in „%f“ ändern. Der folgende Code verwendet „%6.2f“, was den Drucker anweist, sechs Leerzeichen zu reservieren und zwei Nachkommastellen beizubehalten.

„c

int main() {
float a;
a = 0;
while (a <= 100) { printf("%6.2f Grad F = %6.2f Grad C\n", a, (a - 32.0) * 5.0 / 9.0); a = a + 10; } 0 zurückgeben; } „

Jetzt verfügt die Ausgabe über tatsächliche Dezimalstellen. Es sieht professionell aus. Was aber, wenn Sie einen bestimmten Wert benötigen, der nicht zum Muster passt?

Der Körpertemperaturfehler

Stellen Sie sich vor, Sie möchten 98,6 °F (normale menschliche Körpertemperatur) in diese Tabelle eingeben. Es landet nicht auf einem Vielfachen von 10. Sie fügen also eine „if“-Anweisung hinzu.

„c

int main() {
float a;
a = 0;
while (a <= 100) { if (a > 98,6) {
printf(“%6.2f Grad F = %6.2f Grad C\n”, 98.6, (98.6 – 32.0) * 5.0 / 9.0);
}
printf(“%6.2f Grad F = %6.2f Grad C\n”, a, (a – 32.0) * 5.0 / 9.0);
a = a + 10;
}
0 zurückgeben;
}

Bei 100 funktioniert es. Aber ändern Sie das Schleifenlimit auf 200, und die Logik bricht zusammen. Die Bedingung „if (a > 98,6)“ bleibt für jede nachfolgende Iteration wahr. Sie werden immer wieder 98,6°F drucken.

Warum passiert das? Denn die Bedingung prüft, ob die aktuelle Zahl größer als 98,6 ist. Sobald „a“ 100 erreicht, wird es immer größer als 98,6 sein. Sie überprüfen nicht, ob Sie es gerade bestanden haben. Sie prüfen, ob Sie darüber hinaus sind.

Die Lösung: Tracking-Status

Um dies zu beheben, müssen Sie sich den vorherigen Wert merken. Sie führen eine zweite Variable ein, „b“, initialisiert auf -1.

„c

int main() {
schweben a, b;
a = 0;
b = -1;
while (a <= 100) { if ((a > 98,6) && (b < 98,6)) { printf("%6.2f Grad F = %6.2f Grad C\n", 98.6, (98.6 - 32.0) * 5.0 / 9.0); } printf("%6.2f Grad F = %6.2f Grad C\n", a, (a - 32.0) * 5.0 / 9.0); b = a; a = a + 10; } 0 zurückgeben; } „

Jetzt ist die Logik fundiert. Die zusätzliche Zeile wird nur gedruckt, wenn „a“ aktuell über 98,6 liegt UND „b“ zuvor unter 98 lag

Vorheriger ArtikelWarum die technologische Singularität tatsächlich bis 2030 eintreten könnte
Nächster ArtikelSo wählen Sie das sicherste Telefon aus: Hardware, Software und Support in Einklang bringen