C Quadratische Gleichung Rechner?

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?

Woher ich das weiß:Hobby – Hobby, Studium, gebe Nachhilfe

tunik123  11.08.2022, 11:33

Die C-Funktion sqrt() liefert quiet NaN. Man kann also ganz frech erstmal die Wurzel ziehen und dann auf NaN testen.

1
PWolff  11.08.2022, 11:53
@tunik123

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.

0
tunik123  11.08.2022, 12:15
@PWolff

Auch unter C++ wird keine Exception geworfen, wenn man die Wurzel aus einer negativen Zahl ziehen will.

0
PWolff  11.08.2022, 12:18
@tunik123

Stimmt mit den Standardeinstellungen. Irgendwo muss man aber einstellen können, dass eben doch eine Ausnahme geworfen wird, und für diesen Fall sollte man vermutlich vorsorgen.

0
   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

BorisG2011  11.08.2022, 12:10

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.

1