Neuling: Probleme mit sqrt aus <cmath>



  • Hallo Forum,

    bin neu bei C++, habe vorher in Delphi programmiert und habe nun aus Interesse mit C++ angefangen. Nun wollte ich zu Anfang mal so Standard-Programme machen, wie in diesem Beispiel das Lösen einer quadratischen Gleichung mit der pq-Formel.

    #include <cstdlib>
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
      double a = 1;
      double b = 1;
      double c = 1;
      double p = 1;
      double q = 1;
      double d = 0;
      double solution1 = 0;
      double solution2 = 0;
    
      cout << "a=";
      cin >> a;
    
      cout << "b=";
      cin >> b;
    
      cout << "c=";
      cin >> c;
    
      if (a == 0) {
        if (b == 0) {
          if (c == 0) {
            cout << "This is a true expression." << endl;
          }
          else {
            cout << "This is a false expression." << endl;
          }
        }
        else {
          solution1 = -c/b;
          cout << "There is one solution: " << solution1 << endl;
        }
      }
      else {
        p = b/a;
        q = c/a;
        d = p*p/4 - q; //Diskriminante
        if (d < 0) {
          cout << "There is no solution in IR." << endl;
        }
        else if (d=0) {
          solution1 = -p/2;
          cout << "There is one solution in IR: " << solution1 << endl;
        }
        else {
          solution1 = -p/2 + sqrt(d); // HIER LÄUFT IRGENDWAS NICHT RICHTIG !!!
          solution2 = -p/2 - sqrt(d);
          cout << "There are two solutions: " << solution1 << " and "
               << solution2 << endl;
        }
      }
    
      system("PAUSE");
      return EXIT_SUCCESS;
    }
    

    Als Beispiel habe ich x²+5x+6 ausprobiert, mit den Lösungen x=-2 und x=-3, allerdings gibt das Programm als Lösungen x=-2.5 und x=-2.5 aus, also nur -p/2.

    Streiche ich -p/2 aus dem Quelltext, so dass nur noch sqrt(d) dort steht, so kommt 0 heraus. Schreibe ich allerdings anstelle von sqrt(d) sqrt(0.25), läufts so wie es soll.

    Was habe ich falsch gemacht bzw. nicht beachtet?

    MfG,

    Max

    P.S.: IDE ist übrigens wxDev++ und Compiler ist MingW.



  • 1. DEV c++ ist müll (ich muss es wissen ich benutze es auch, WARUM AUCH IMMER)

    2. so viel vom ziel des scriptes versteh ich ja nicht, aber cih würde mit klammern nicht so sparsam sein. zb:

    solution1 = (((-p)/2) + sqrt(d)); // HIER LÄUFT IRGENDWAS NICHT RICHTIG !!!
    

    sieht vielleicht nicht so hübsch ,aber hilft vielleicht.

    {ps: soll das was mit Funktionen für parabeln sein oder so ? gott ist etwas her als ich das zuletzt in mathe hatte.|| quadratische Funktionen ?)


  • Administrator

    1. wxDev++ ist in Ordnung
    2. Klammersetzung ist in Ordnung
    3. Tim06TR hat keine Ahnung ... lol sorry, ist nicht so gemeint, nur ein Witz 😉
    4. Zeile 48:

    else if (d=0) // das sollte wohl eher == sein ;)
    

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39453.html

    Grüssli



  • [quote="konbom"]

    else if (d=0) {
    

    :p



  • Ajajaj, das kommt, wenn man jahrelang Delphi programmiert hat, da wärs richtig...

    Danke, danke, danke 😃 😃

    Den Fehler macht hoffentlich jeder Anfänger mal 😉



  • Dravere schrieb:

    3. Tim06TR hat keine Ahnung ... lol sorry, ist nicht so gemeint, nur ein Witz 😉

    mag sein, aber ich versuch mein bestes :p


  • Administrator

    konbom schrieb:

    Den Fehler macht hoffentlich jeder Anfänger mal 😉

    Ich mache es sogar zum Teil heute noch. Deshalb gibt es da einen kleinen Trick, welcher von einigen allerdings als nicht besonders schön angesehen wird. Aber ich zeig ihn jetzt mal trotzdem, kannst dann selber drüber urteilen 😉

    int main()
    {
      double d = 0.0;
    
      if(0.0 = d) // Kompilerfehler ;)
      {
        // ...
      }
    
      return 0;
    }
    

    Also einfach die Sache vertauschen, dann wird der Kompiler dich darauf hinweisen 😉

    Grüssli


Anmelden zum Antworten