Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ungültige Gleitkommaoperation (https://www.delphipraxis.net/151552-ungueltige-gleitkommaoperation.html)

aphexx 22. Mai 2010 16:05


Ungültige Gleitkommaoperation
 
Hallo Leute!

Dies ist mein erster Post, also gibt's gleich ne Noob-Frage ;)

Wenn ich den Fehler 'Ungültige Gleitkommaoperation' erhalte,
kann das noch was anderes sein als ein Zahlenwert durch null?

In meinem Programm bekomme ich nämlich diese Fehlermeldung aus heiterem Himmel.
Vor ein paar Minuten war noch alles ok.

Delphi-Quellcode:
procedure TFAnimus.gbTweakCameraZoomChange(Sender: TObject);
var
  zoom, x1,y1,z1, x2, y2, z2, newX, newY, newZ: Extended;
begin
  zoom := gbTweakCameraZoom.Position/(gbTweakCameraZoom.Max); //max ist natürlich nicht 0
 
  DecimalSeparator := '.';

  x1 := (gbCamTweakerPosX.Position-gbCamTweakerPosX.Max div 2)/1000; //GaugeBars aus Graphics32
  y1 := (gbCamTweakerPosy.Position-gbCamTweakerPosY.Max div 2)/1000;
  z1 := (gbCamTweakerPosZ.Position-gbCamTweakerPosZ.Max div 2)/1000;

  x2 := (gbCamTweakerTargetX.Position-gbCamTweakerTargetX.Max div 2)/1000;
  y2 := (gbCamTweakerTargetY.Position-gbCamTweakerTargetY.Max div 2)/1000;
  z2 := (gbCamTweakerTargetZ.Position-gbCamTweakerTargetZ.Max div 2)/1000;

  newX := MixValues(x1, x2, zoom); //hier kommt keine Division vor; ist eine einfache lineare Interpolation
  newX := MixValues(y1, y2, zoom);
  newZ := MixValues(z1, z2, zoom);

  LEcamX.Text := FloatToStr(newX); //hier kann es irgendwo sein, da nach der Fehlermeldung
  LEcamY.Text := FloatToStr(newY); //der Wert newY in LEcamX eingetragen wird..
  LEcamZ.Text := FloatToStr(newZ);
end;
Nach dem Fehler bleibt die betreffende GaugeBar irgendwie im OnChange hängen.
Das ist daran zu erkennen, dass der Anfasser nicht mehr einrastet und OnChange
immer ausgeführt wird, sobald man die Maus über die Komponente hält.

Vielen Dank schonmal im Voraus.

DeddyH 22. Mai 2010 16:11

Re: Ungültige Gleitkommaoperation
 
Auf die Schnelle fällt mir nur auf, dass Du 2 mal newX Werte zuweist, aber niemals newY.
Zitat:

Delphi-Quellcode:
newX := MixValues(x1, x2, zoom); //hier kommt keine Division vor; ist eine einfache lineare Interpolation
newX := MixValues(y1, y2, zoom); //das soll vermutlich newY sein


Medium 22. Mai 2010 17:51

Re: Ungültige Gleitkommaoperation
 
Das wird's sein. newY ist dann mit "Irgendwas" gefüllt, und dieses "Irgendwas" kann durchaus ein für Extended ungültiges Bitmuster sein, woraufhin sich FloatToStr() verschluckt.

Edit: "//hier kommt keine Division vor; ist eine einfache lineare Interpolation" - Wie kann man divisionsfrei lerpen? ;)

aphexx 23. Mai 2010 11:48

Re: Ungültige Gleitkommaoperation
 
2 mal newX :oops: ...
das wars tatsächlich, vielen dank für die schnelle Lösung!

lerpen... so heißt das also im coderslang, gut zu wissen. ;)
Ich bin mal frech davon ausgegangen, dass keine division stattfindet,
wenn 0 < t < 1 gegeben ist und Wert a und b damit multipliziert werden.

Delphi-Quellcode:
function MixValues(V1, V2, t: Extended):Extended;
var
  inv: Extended;
begin
  inv := 1-t;
  Result := V1*inv+V2*t;
end;

Medium 23. Mai 2010 12:04

Re: Ungültige Gleitkommaoperation
 
Jo, da hast du auch Recht, da war ich blöd :stupid:. Irgendwie war ich gestern auf dem Pfad, dass da irgendwo eine Normierung mit drin stecken müsste - warum auch immer. Sorry für die Verwirrung.
Warum das oft Lerp genannt wird weiss ich nicht einmal so genau, ich vermute dahinter irgendwie ein seltsames Kürzel für linear interpolation :D

Und: Herzlich willkommen in der DP! :dp:

himitsu 23. Mai 2010 13:05

Re: Ungültige Gleitkommaoperation
 
Zitat:

Zitat von Medium
Warum das oft Lerp genannt wird weiss ich nicht einmal so genau:

Du kannst dich ja mal beim Raymond beschweren. http://en.wikipedia.org/wiki/Linear_interpolation

Medium 23. Mai 2010 13:49

Re: Ungültige Gleitkommaoperation
 
Hm, das festigte immerhin das "Das", aber zum "Warum" steht im Jargon File leider auch nicht viel mehr. Ich mag lerp trotzdem :) (Und danke für's Aufzeigen, dass ich zu faul war selbst genauer nachzuschauen :P)

himitsu 23. Mai 2010 13:53

Re: Ungültige Gleitkommaoperation
 
Bitte :tongue:
Und wenn es für dich ein Trost ist ... du kannst einfach behaupten du hättest gesucht, aber die deutsche Wiki meinte sie kenne Lerp nicht.

Vielleicht isses einfach nur irgendein privates Kustwort, welches mal jemand so sagte und dann verwendeten es Alle, anstatt es auch mal zu hinterfragen?

Medium 23. Mai 2010 14:13

Re: Ungültige Gleitkommaoperation
 
Sowas in der Art muss das sein, jops =)

Und mit der Ausrede würd ich mir ja nochmal ins Bein schießen, die Englische WP ist grad bei solchen Dingen doch die #1 (unter den Wiki-Sprachversionen), wenn dann nur da :). Nein, ich trage meine Schande mit Würde!


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