AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem: 'ungültige Gleitkommaoperation'

Problem: 'ungültige Gleitkommaoperation'

Ein Thema von C0M3T · begonnen am 6. Mär 2012 · letzter Beitrag vom 7. Mär 2012
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#11

AW: Problem: 'ungültige Gleitkommaoperation'

  Alt 6. Mär 2012, 19:37
Ich würde ja noch 2 weitere Variablen einführen, nennen wir sie g und h, um bei der merkwürdigen Benennung zu bleiben. Das spart Wiederholungen und somit Berechnungen ein und lässt sich im Vorfeld leichter überprüfen.
Delphi-Quellcode:
var
  a, b, c, d, f, g, h: real;
begin
  a := strtofloat(edit1.text);
  b := strtofloat(edit2.text);
  c := strtofloat(edit3.text);
  g := b / a / 2;
  h := sqr(g) - c / a;
  if h < 0 then
    ShowMessage('Nicht lösbar')
  else
    begin
      d := g + sqrt(h);
      f := g - sqrt(h);
      Edit4.text := FloatToStr(d);
      Edit5.text := FloatToStr(f);
    end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.145 Beiträge
 
Delphi 12 Athens
 
#12

AW: Problem: 'ungültige Gleitkommaoperation'

  Alt 6. Mär 2012, 19:44
Zitat:
ob a=0
Ergibt einen Division-Durch-0-Fehler.

EDivByZero bei Integer-DIV
EZeroDivide bei Fließkomma-/
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#13

AW: Problem: 'ungültige Gleitkommaoperation'

  Alt 6. Mär 2012, 19:50
Alternativ kannst du die Rechnung in ein Try-Except-End Block packen. Gibt es einen Fehler, wird der Teil in Except ausgeführt.
Noch ein Nachtrag: soweit du es nicht irgendwo in der IDE abgeschaltet hast, bekommst du immer noch eine hässliche Fehlermeldung. Führst du später die Exe Anwendung direkt aus, kommt die Meldung evtl. nicht, d. h. du mußt selbst für eine Fehlermeldung sorgen.
  Mit Zitat antworten Zitat
C0M3T

Registriert seit: 6. Mär 2012
Ort: Leipzig, Sachsen
6 Beiträge
 
Delphi XE Professional
 
#14

AW: Problem: 'ungültige Gleitkommaoperation'

  Alt 6. Mär 2012, 20:33
Also DaddyH 's Quellcode kurz angepasst und ausprobiert.
Funktioniert nun wunderbar!
Vielen Dank an euch alle, für die schnelle Hilfe!

Delphi-Quellcode:
 var a,b,c,d,f,g,h:real;
begin
 a:=strtofloat(edit1.text);
 b:=strtofloat(edit2.text);
 c:=strtofloat(edit3.text);
 g:= b/a/2;
 h:= g*g-c/a;
 if h<0 then
 ShowMessage('Nicht Lösbar (Wurzel 0)')
 else
  begin
    d:= -g+sqrt(h);
    f:= -g-sqrt(h);
    Edit4.Text:=FloattoStr(d);
    Edit5.Text:=Floattostr(f);
  end;

Geändert von C0M3T ( 6. Mär 2012 um 20:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.145 Beiträge
 
Delphi 12 Athens
 
#15

AW: Problem: 'ungültige Gleitkommaoperation'

  Alt 6. Mär 2012, 23:28
if h<0 then
kleiner Null
ShowMessage('Nicht Lösbar (Wurzel 0)')
gleich Null

Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#16

AW: Problem: 'ungültige Gleitkommaoperation'

  Alt 6. Mär 2012, 23:32
@himitsu
[OT]
bei dem vielen SQL den ich um die Ohren habe tut mir Null=0 weh
[/OT]
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi ( 6. Mär 2012 um 23:44 Uhr)
  Mit Zitat antworten Zitat
C0M3T

Registriert seit: 6. Mär 2012
Ort: Leipzig, Sachsen
6 Beiträge
 
Delphi XE Professional
 
#17

AW: Problem: 'ungültige Gleitkommaoperation'

  Alt 7. Mär 2012, 07:25
Habe ich schon angepasst 'Error: Wuzel(-x)'
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#18

AW: Problem: 'ungültige Gleitkommaoperation'

  Alt 7. Mär 2012, 08:55
Nur mal mein Senf zu den Bemühungen der letzten Stunden. Irgendwo oben habe ich geschrieben, dass ich von der Einstellung her keine Überraschungen mag, was bedeutet, dass ich zuerst prüfe ob eine Text-Datei vorhanden ist und welche Größe sie hat, bevor ich sie dann ich einem Try-Except Block öffne. Ich hab mal bei einigen meiner Projekte eine Überprüfung gemacht und festgestellt, dass fast ein drittel des Programms aus Überprüfungen besteht. Nun zu dem hier:
Delphi-Quellcode:
 var a,b,c,d,f,g,h:real;
begin
 a:=strtofloat(edit1.text);
 b:=strtofloat(edit2.text);
 c:=strtofloat(edit3.text);
 g:= b/a/2;
 h:= g*g-c/a;
 if h<0 then
 ShowMessage('Nicht Lösbar (Wurzel 0)')
 else
  begin
    d:= -g+sqrt(h);
    f:= -g-sqrt(h);
    Edit4.Text:=FloattoStr(d);
    Edit5.Text:=Floattostr(f);
  end;
Selbst ich mit meinem übertriebenem Kontrollsinn würde irgendwann es gut sein lassen. Eine Formel ist nun mal eine Formel. Eine vorherigen Überprüfung macht nur dann einen Sinn, wenn man eingreifen kann. Wenn ich a/b nehmen, kann ich vorher prüfen ob b gleich 0 ist. Aber was bringt mir das? Nichts. Ich kann die Fehlermeldung abfangen, vielleicht kann ich dem Nutzer auch sagen, dass b gleich 0 ist, wenn er b direkt eingeben kann, aber welchen Sinn macht es bei a/(b-c) vorher zu überprüfen ob b - c = 0 ergibt? Auf was ich hinaus will ist: irgendwann sollte man eine Kosten/Nutzen Rechnung machen. Und hier wäre die Frage: welchen Nutzen hat es eine Formel in seine Bestandteile zu zerlegen? Hat er Einfluss auf h wenn es kleiner 0 ist? Macht er eine 1 draus? Nein, er sagt nur, dass die Formel nicht funktioniert. Und das sagt ihm das System auch. Es hat also keinen Nutzen die Formel zu zerfleischen. Man sollte es irgendwann gut sein lassen. Aber das ist nur mein Senf.

Entweder man ist ein Kontrollfreak und überprüft vorher jeden Teil der Formel, was aber nur Sinn macht wenn man es beeinflussen kann, was hier nicht der Fall ist, oder mal läßt die Formel Formel sein.

Irgendwann sollte mal lernen mit der Fehlermeldung des Systems zu leben.
Delphi-Quellcode:
 var a,b,c,d,f:real;
begin
 a:=strtofloat(edit1.text);
 b:=strtofloat(edit2.text);
 c:=strtofloat(edit3.text);
 try
   d:=((b/a)/2)+sqrt(((b/a)/2)*((b/a)/2)-c/a);
   Edit4.Text:=FloatToStr(d);
 except
   Edit4.Text:='Fehler in der Berechnung 1';
 end;
 try
   f:=((b/a)/2)-sqrt(((b/a)/2)*((b/a)/2)-c/a);
   Edit5.Text:=FloatToStr(f);
 except
   Edit5.Text:='Fehler in der Berechnung 2';
   //...
 end;
end;
Nur mal als Info an C0M3T, eine Fehlermeldung kommt hier nur in der IDE. Beim fertigen Programm sieht man nur die Meldung in den Editfeldern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#19

AW: Problem: 'ungültige Gleitkommaoperation'

  Alt 7. Mär 2012, 09:00
Mal abgesehen davon, dass Du somit das DRY wieder im Code hast, müsstest Du dann aber auch wieder die Exception analysieren. Ich kann Dir aus Erfahrung sagen, dass nichts nerviger ist, als Fehlermeldungen der Art (Originalzitat):
Zitat:
Es ist ein Anwendungsfehler aufgetreten (EAccessViolation)
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#20

AW: Problem: 'ungültige Gleitkommaoperation'

  Alt 7. Mär 2012, 09:34
Ich hab zuerst die Fehlermeldung analysiert, hab sie dann wieder entfernt (Teile davon habe ich vergessen, siehe //... im zweiten Except Block), da ich mir überlegt habe welchen Nutzen es bringt zu wissen welcher Fehler vorkam. Dass ein Fehler in der Berechnung vorkommt steht im Editfeld.

Jetzt bitte nicht böse sein, aber was sagt dir die Meldung 'Nicht Lösbar (Wurzel 0)' , wenn du fünf Editfelder und ein Button auf dem Formular hast? Du fragst dich wahrscheinlich: was für eine Wurzel? Denn von einer Wurzel sehe ich auf dem Formular nichts. Für mich ist das Formular eine Blackbox. Ich gebe drei Zahlen ein und bekomme zwei Ergebnisse, wenn ich Ok klicke. Selbst wenn ich wüßte was für eine Formel dahinter steckt, ich kann es nicht beeinflussen, denn ich hab keinen direkten Einfluss auf h. Soll ich vorher einen Taschenrechner nehmen alles durchrechnen, damit ich fehlerfreie Eingaben machen? Wozu dann bitte das Programm?

Sinn würde es hier machen:
Delphi-Quellcode:
 var a,b,c:real;
begin
 a:=strtofloat(Edit1.text);
 b:=strtofloat(Edit2.text);
 if b = 0 then
 begin
   MessageDlg('Feld 2 enthält 0 (Division durch 0)', mtError, [mbOk], 0);
   Exit;
 end;
 c := a / b;
 Edit3.Text:=FloatToStr(c);
end;
Hier habe ich die Eingaben analysiert und sage dem Anwender wie er den Fehler vermeiden kann. Aber spätestens bei der Formel c := a / (b - 1) würde eine Division durch 0 dem Anwender nichts bringen. Die Formel ist Komplex, er hat keinen Einfluß drauf. Also lieber gleich ein allgemeines Error.

Es ist nicht verwerflich eine allgemeine Fehlermeldung auszugeben wenn sie dem Anwender sowieso keinen Sinn ergibt. Und hier macht es keinen Sinn. Die Formel ist zu komplex, er kann sie nicht anpassen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz