Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » ungültige gleitkommaoperation

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.04.2011, 22:18 Uhr
David238



hi euch allen und einen schönen ostermontag!
ich habe folgendes problem:
meine aufgabe ist es ein programm zu schreiben mit dem sich quadratische gleichungen der form ax^2+x+q lösen lassen.
so sieht mein programm grade aus:


C++:
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "quadratischegleichung16.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
float a,b,c;     // Eingabevariablen
float  w, l1, l2, l;   // Diskriminante und Lösungen

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();         //Programm beenden
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  a= StrToInt(Edit1->Text);
  b= StrToInt(Edit2->Text);
  c= StrToInt(Edit3->Text);
  w= sqrt(((b/a*b/a)/4)-c/a); //Berechnung der Diskriminante

if (w==0)
{
  l=-b/2*a;
       Edit4->Text=FormatFloat("0.00",l1);
}

if (w<0)
{
    Edit4->Text="Es gibt keine Lösung!";
}

if (w>0)
{
   l1=-b/2*a+ w;                    //Lösung 1
   Edit4->Text=FormatFloat("0.00",l1);
   l2=-b/2*a-w;                       //Lösung 2
   Edit5->Text=FormatFloat("0.00",l2);
}


}



bei der unterscheidung nach wurzel<0, wurzel>0 und wurzel=0 fangen meine probleme an.
wenn ich meine variablen so eingebe das die wurzel positiv wird bekomme ich 2 richtige ergebnisse.
für die beiden anderen fälle bekomme ich die fehlermeldung "ungültige gleitkommaoperation".
über diese fehlermeldung habe ich schon viel im netz gelesen, bin daraus aber nicht wirklich schlau geworden.
ich hoffe ihr könnt mich "erleuchten" ;-)
lg david

Dieser Post wurde am 27.04.2011 um 08:18 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.04.2011, 23:18 Uhr
0xdeadbeef
Gott
(Operator)


Generell liefert sqrt immer die positive Wurzel zurück. Ansonsten ist schlicht nicht jede quadratische Gleichung lösbar - wo ((b/a*b/a)/4)-c/a < 0 ist, gibt es keine Nullstellen für ax² + bx + c. Eine Quadratwurzel negativer Zahlen gibt es in R nicht, und sqrt ist berechtigt, bei einem solchen Versuch eine Gleitkommaausnahme auszulösen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 25.04.2011 um 23:19 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.04.2011, 12:46 Uhr
David238



Danke.
Das man eine negative Wurzel nicht berechnen kann ist mir klar.
Ich habe jetzt auch verstanden warum sqrt dann den Fehler auslöst. Hätte ich mir auch denken können.
Aber wie kann ich das nun umgehen?
Wie man im Programmtext schon sieht möchte ich für negative Wurzeln den Text " Es gibt keine Lösung" ausgeben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.04.2011, 15:06 Uhr
ao

(Operator)


Du darfst sqrt(diskriminante) nur dann aufrufen, wenn diskriminante >= 0 ist. Also VOR dem Aufruf von sqrt den Test machen, ob das Argument negativ ist, und wenn ja, "es gibt keine Lösung" ausgeben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.04.2011, 08:18 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von ao:
ob das Argument negativ ist, und wenn ja, "es gibt keine Lösung" ausgeben.

du meinst eher "Es gibt keine reelle Lösung" ;-)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.04.2011, 10:48 Uhr
Hans
Library Walker
(Operator)


@Flo: Ich bezweifele, das er die komplexe Lösung kennt.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.04.2011, 14:05 Uhr
0xdeadbeef
Gott
(Operator)


Mit p = b / a, q = c / a, D = (p/2)² - q ist die komplexe Lösung halt -p/2 ± i * sqrt(-D).

Das, weil sqrt(D) = sqrt(-1 * -D) = sqrt(-1) * sqrt(-D) = i * sqrt(-D).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 27.04.2011 um 14:05 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: