Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Überlauf bei Fließkommoperation (https://www.delphipraxis.net/44045-ueberlauf-bei-fliesskommoperation.html)

Maximus 12. Apr 2005 15:27


Überlauf bei Fließkommoperation
 
Hallo,

Und schonwieder steh ich vor einem riesen Problem, dieser Fehlermeldung:

Code:
Überlauf bei Fließkommaoperation
Ich schreibe gerade eine Flugbahn Simulation, die die Flugbahn eines benutzerdefinierten Balls, in einer benutzerdefinierten Umgebung simulieren soll.

Es funktioniert perfekt bei einem Golfball in der Luft. Sobald man aber die Dichte hochdreht, so das es Wasser wäre, kommt diese Fehlermeldung.

Die Werte sind alle vom Typ Extended. Der X und Y Wert für den Ball werden nach der Berechnung mit dem round() Befehl zugewiesen.

Als einzigste Lösung würde mir momentan Einfallen nach z.b. 15 Nachkommastellen den Rest abzuschneiden aber
1. Weiß ich nicht ob es dann funktionieren würde
2. Wäre das ein riesen Aufwand

Ich hoffe ihr habt (gute) Lösungsvorschläge

MFG
Maximus

Binärbaum 12. Apr 2005 15:51

Re: Überlauf bei Fließkommoperation
 
Könntest du mal etwas Code zeigen, wo dieser Fehler auftritt?

Meist liegt es daran, dass man in irgendwelchen Berechnungen sehr hohe Zahlen hat und diese dann einfach nicht mehr mt Extended dargestellt werden können.


MfG
Binärbaum

Maximus 12. Apr 2005 15:56

Re: Überlauf bei Fließkommoperation
 
Hier mal die Berechnungs Procedure. Die Variablen sind alle bis auf die "Vorzeichen-Variablen" als Extended deklariert

Delphi-Quellcode:
procedure TBallEngine.Move;
var aw, ax, ay, lookX, lookY: Extended;
    vor_vx, vor_vy: Integer;
begin
 lookX := x + vx * tau;
 lookY := y + vy * tau;

 if (lookX > 700-Breite) or (lookX < 0) then vx := -e * vx;
 if (lookY > 300) or (lookY < Hoehe) then vy := -e * vy;

 if x < 0 then x := 0;
 if x > 700-Breite then x := 700-Breite;
 if y < Hoehe then y := Hoehe;
 if y > 300 then y := 300;

 aw := k * vw * vw;
 ax := k * vx * vx; //nach einem Fehler springt er immer in eine dieser 3 Zeilen
 ay := k * vy * vy;

 if vx < 0 then vor_vx := 1 else vor_vx := -1;
 if vy < 0 then vor_vy := 1 else vor_vy := -1;

 vx := vx + vorz_vw * aw * tau + vor_vx * ax * tau;
 vy := vy - g * tau + vor_vy * ay * tau;

 x := x + vx * tau;
 y := y + vy * tau;
end;
MFG
Maximus

Phistev 12. Apr 2005 16:22

Re: Überlauf bei Fließkommoperation
 
Wie groß ist denn k? Lass dir doch (mit Hile von try...except und ShowMessage) im Fehlerfall die relevanten Werte ausgeben und rechne mal nach, wie groß das Ergebnis ist. Die Nackommastellen sind übrigens irrelevant, was nicht passt, wird abgeschnitten.

gordon freeman 12. Apr 2005 16:48

Re: Überlauf bei Fließkommoperation
 
Zitat:

Zitat von Phistev
Wie groß ist denn k? Lass dir doch (mit Hile von try...except und ShowMessage) im Fehlerfall die relevanten Werte ausgeben

Da brauch man gar nicht so einen Aufwand zu betreiben. Einfach STrg + Alt + W drücken und die zu überwachenden Variablen eintragen. Dann einen Haltepunkt setzen und bequem mit F7 einfach durch den Code gehen. Dann kriegst du auf jeden Fall raus, an welcher Stelle der Fehler passiert und kannst dir die Werte an entsprechender Stelle angucken!

Maximus 12. Apr 2005 16:56

Re: Überlauf bei Fließkommoperation
 
So bis her bin ich zu dem Ergebniss gekommen das er abschmiert weil Vx bzw. Vy zu groß werden.
Mein Programm hat Werte für Vx/Vy ausgespuckt in ca. der größenordnung 5,6894^*10^4600 (5,6894E4600 - E beudeutet doch hoffentlich auch *10^)

Wenn diese dan in der Formel ax = k*vx² auch noch quadriert werden dan überschreitet das natürlich den Extended Bereich
(Extended: 3.4 x 10^-4932 .. 1.1 x 10^4932)

So der Fehler ist gefunden, doch wie kann ich ihn beheben?

:gruebel: *angestrengt nachdenkt*

MFG
Maximus

Binärbaum 12. Apr 2005 17:04

Re: Überlauf bei Fließkommoperation
 
Zitat:

Zitat von Maximus
So bis her bin ich zu dem Ergebniss gekommen das er abschmiert weil Vx bzw. Vy zu groß werden.
Mein Programm hat Werte für Vx/Vy ausgespuckt in ca. der größenordnung 5,6894^*10^4600 (5,6894E4600 - E beudeutet doch hoffentlich auch *10^)

Wenn diese dan in der Formel ax = k*vx² auch noch quadriert werden dan überschreitet das natürlich den Extended Bereich
(Extended: 3.4 x 10^-4932 .. 1.1 x 10^4932)

So der Fehler ist gefunden, doch wie kann ich ihn beheben?

:gruebel: *angestrengt nachdenkt*

MFG
Maximus

Was genau berechnest du eiogentlich mit diesen Werten?
Bei so einer Größenordnung tippe ich fast, dass da im Programm vorher schon ein Fehler ist, der die Zahlen in ungeahnte Höhe steigen lässt (z.B. Division durch eine seeeeehr kleine Zahl).

MfG
Binärbaum

Phistev 12. Apr 2005 17:16

Re: Überlauf bei Fließkommoperation
 
@Binärbaum: siehe erster Post.

Allerdings glaube ich auch dass die Werte zu groß sind, ich kann mir kein Koordinatensystem mit SO großen Werten denken, X und Y werden ja auch auf Werte unter 1000 gesetzt.

Maximus 12. Apr 2005 17:20

Re: Überlauf bei Fließkommoperation
 
Zitat:

Zitat von Binärbaum
Was genau berechnest du eiogentlich mit diesen Werten? (1.)
Bei so einer Größenordnung tippe ich fast, dass da im Programm vorher schon ein Fehler ist, der die Zahlen in ungeahnte Höhe steigen lässt (z.B. Division durch eine seeeeehr kleine Zahl). (2.)

1. ax ist die Bremsbeschleunigung

2. Nein eigentlich gibt es keine Division durch eine seeehr kleine Zahl.
Vx wird beim Initialisieren berechnet ( Vx = V * cos(w) )
D.h. Beim ersten Aufruf dieser Move Procedure ist Vx (bei V = 500 und w = 45°) ca. 354
Und bei jedem weiteren Aufruf (in Timer Procedure mit Interval = 1) wird Vx größer (außer man hat einen entsprechenden Gegenwind, dann steigt Vx nicht so stark an und das Programm funktioniert auch) <--- Edit: Natürlich wird Vx bei jedem aufruf kleiner ... da muss wohl beim initialisieren was schief laufen ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 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