![]() |
Überlauf bei Fließkommoperation
Hallo,
Und schonwieder steh ich vor einem riesen Problem, dieser Fehlermeldung:
Code:
Ich schreibe gerade eine Flugbahn Simulation, die die Flugbahn eines benutzerdefinierten Balls, in einer benutzerdefinierten Umgebung simulieren soll.
Überlauf bei Fließkommaoperation
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 |
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 |
Re: Überlauf bei Fließkommoperation
Hier mal die Berechnungs Procedure. Die Variablen sind alle bis auf die "Vorzeichen-Variablen" als Extended deklariert
Delphi-Quellcode:
MFG
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; Maximus |
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.
|
Re: Überlauf bei Fließkommoperation
Zitat:
|
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 |
Re: Überlauf bei Fließkommoperation
Zitat:
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 |
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. |
Re: Überlauf bei Fließkommoperation
Zitat:
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 22:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz