C Quadratische Gleichung Rechner?
Ich habe eine Formel zur lösung:
X¹,² = (-b±sqrt(b²-4ac))/2a
falls für die Diskriminante gilt: b²-4ac>=0
Ist der Wert (b² - 4ac>=0) negativ, dann keine reelle Lösung
Wie schreibe ich das am besten als c code? Denn irgendwie kriege ich nur fehler.
Hier zum Testen ob es klappt:
2x²-2x-1.5 = 0 Lösung = x¹=1.5, x²=-0.5
2 Antworten
Ich würde erst einmal die Diskriminante (den Wert unter der Wurzel) ausrechnen und dann je nach Vorzeichen verzweigen.
Oder ich würde es mir einfach machen und ein Paar von floats zurückgeben, die je nach Eingabe numerische Werte oder IEEE-Overflows bzw. IEEE-NaNs enthalten. Um signalling overflows / signalling NaNs abzufangen, kann man try verwenden. Oder das Signalling unterdrücken - ist aber nicht ganz durchsichtig und deshalb nur zu empfehlen, wenn es auf jede Nanosekunde ankommt: https://stackoverflow.com/questions/8180752/how-to-convert-signalling-nan-to-quiet-nan)
Welchen C-Code hast du?
Kompilierzeit- oder Laufzeit-Fehler? Welcher?
Danke - da habe ich nicht mehr so den Überblick. C ist hier - wenig überraschend - IEEE-754-konform. Bleibt noch, sicherzustellen, dass die Ausnahme keine Unterbrechung auslöst.
double a,b,c,x1,x2;
a = 2; b = -2; c = -1.5;
x1 = (-b + sqrt(b*b-4*a*c)) / (2*a);
x2 = (-b - sqrt(b*b-4*a*c)) / (2*a);
printf("%lg %lg\n", x1, x2);
a = 2; b = -2; c = 10;
x1 = (-b + sqrt(b*b-4*a*c)) / (2*a);
x2 = (-b - sqrt(b*b-4*a*c)) / (2*a);
printf("%lg %lg\n", x1, x2);
if(isnan(x1)) printf("keine Loesung\n");
liefert als Ausgabe
1.5 -0.5
-nan(ind) -nan(ind)
keine Loesung
Der Beispielcode ist eine hübsche Demonstration der Tatsache, dass modere Arithmetikprozessoren für die Quadratwurzel aus einer negativen Zahl einen NaN-Wert liefern. (NaN steht für "Not a Number") Mit NaN-Werten kann man einfach weiterrechnen.
Wenn die Aufgabe so gestellt wurde, dass keine NaN-Werte abgefragt werden sollen, würde man wohl so programmieren:
#include <stdio.h>
#include <math.h>
int main(int argc, char* argv[]) {
double a,b,c,x1,x2;
double d; // diskriminante
a = 2; b = -2; c = -1.5;
d = sqrt(b*b-4*a*c);
if (d >= 0.0) {
x1 = (-b + sqrt(b*b-4*a*c)) / (2*a);
x2 = (-b - sqrt(b*b-4*a*c)) / (2*a);
printf("%lg %lg\n", x1, x2);
} else {
printf("keine Loesung\n");
}
return 0;
}
Hier wird erst die Diskriminante berechnet und dann eine Fallunterscheidung vorgenommen - so wie es im Mathematikunterricht auch eingeübt wird.
Hinweis zur Compilierung: Die mathematischen Funktionen stehen in einer Bibliothek, die mit
-lm
eingebunden werden muss. Der Compiler ist also mit dieser Option aufzurufen.
Die C-Funktion sqrt() liefert quiet NaN. Man kann also ganz frech erstmal die Wurzel ziehen und dann auf NaN testen.