AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Überlauf bei Fließkommoperation

Ein Thema von Maximus · begonnen am 12. Apr 2005 · letzter Beitrag vom 12. Apr 2005
Antwort Antwort
Maximus

Registriert seit: 26. Okt 2003
169 Beiträge
 
#1

Überlauf bei Fließkommoperation

  Alt 12. Apr 2005, 15:27
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
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Überlauf bei Fließkommoperation

  Alt 12. Apr 2005, 15:51
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
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Maximus

Registriert seit: 26. Okt 2003
169 Beiträge
 
#3

Re: Überlauf bei Fließkommoperation

  Alt 12. Apr 2005, 15:56
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
  Mit Zitat antworten Zitat
Phistev
(Gast)

n/a Beiträge
 
#4

Re: Überlauf bei Fließkommoperation

  Alt 12. Apr 2005, 16:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Überlauf bei Fließkommoperation

  Alt 12. Apr 2005, 16:48
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!
  Mit Zitat antworten Zitat
Maximus

Registriert seit: 26. Okt 2003
169 Beiträge
 
#6

Re: Überlauf bei Fließkommoperation

  Alt 12. Apr 2005, 16:56
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?

*angestrengt nachdenkt*

MFG
Maximus
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Überlauf bei Fließkommoperation

  Alt 12. Apr 2005, 17:04
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?

*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
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Phistev
(Gast)

n/a Beiträge
 
#8

Re: Überlauf bei Fließkommoperation

  Alt 12. Apr 2005, 17:16
@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.
  Mit Zitat antworten Zitat
Maximus

Registriert seit: 26. Okt 2003
169 Beiträge
 
#9

Re: Überlauf bei Fließkommoperation

  Alt 12. Apr 2005, 17:20
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 ...
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:37 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