Autor Beitrag
perry5
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102



BeitragVerfasst: So 07.01.07 22:53 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
   Substract(m_Point[1], l_Point, l_Connection1);
   Substract(m_Point[2], l_Point, l_Connection2);
   Substract(m_Point[3], l_Point, l_Connection3);
   l_Connection1.Normalize;
   l_Connection2.Normalize;
   l_Connection3.Normalize;

   l_AngleSum:=l_AngleSum+arccos(Skalarprodukt(l_Connection1, l_Connection2));
   l_AngleSum:=l_AngleSum+arccos(Skalarprodukt(l_Connection2, l_Connection3));
   l_AngleSum:=l_AngleSum+arccos(Skalarprodukt(l_Connection3, l_Connection1));

Hier tritt bei einem der arccos Funktionen der Fehelr auf. Ungültige Gleitkommaoperation.
die ganzen l_Connection's sind alle vom Typ CVector, l_AngleSum ist real und mit 0 initialisiert.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
 procedure CVector.Normalize;
  var l_length : real;
 begin
  l_length:=self.Length;
  if(l_length<>0then
  begin
   X:=X/l_length;
   Y:=Y/l_length;
   Z:=Z/l_length;
  end;
 end;

 function CVector.Length : real;
 begin
  result:=sqrt(X*X+Y*Y+Z*Z);
 end;

 function Skalarprodukt(V1 : CVector; V2 : CVector) : real;
 begin
  result:=(V1.X*V2.X)+(V1.Y*V2.Y)+(V1.Z*V2.Z);
 end;


In der Hilfe standt, das arccos nur Werte von -1 bis 1 haben darf. Ist ja auch mathematich korrekt so.
Dasehalb sind die Vektoren ja auch normalisiert worden. Tjo, sie werdne nur nciht normalisiert, wenn ihre Länge 0 ist, sonst gäbs ja "divided by zero".
Nun, sowohl Normalize als aus Skalarprodukt müssten korrekt sein, ahben auch immer Funktioniert.


Theoretisch müsste es ja auch von den Vektoren m_Point[1..3] und l_Point total unabhängig sein. Wie gesagt, die l_Conenction's müssten doch theoretisch ganz beliebige Vektoren sein können. Bei CVector sindd ie 3 Elemente real's, also, ka.
Für Nullvektoren ist ja das Skalarprodukt dann halt auch immer 0 was bei arccos keine Probmleme machen dürfte.
Initialisiert sind die l_Connection's auch sonst müsste es ja auch zugriffsfehler geben, oder?

Ich bin gerade am verzweifeln, denn das dürfte gar nicht sein, wie es ist. Bei normalisierten Vkeotren kann Skalarprodukt nix außerhabl von -1..1 erzuegen und wie könnte es sonst zu diesem Fehler kommen? eine addition kann wohl kaum dafür verantwortlich sein, nur der Debugger zeigt halt genau immer eine der arccos Zeilen als Fehler an.

Ich bin echt mit meinem Latein am Ende.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 07.01.07 23:05 
Wie wärs, wenn du einfach mal ein paar ShowMessages benutzt...
Ich meine immer vor der entsprechenden Zeile ShowMessage(FloatToStr(Skalarprodukt(l_Connection1, l_Connection2)));.

Abgesehen davon: Wenn der Fehler beim letzten Normalize auftreten sollte, dann würde die erste Zeile mit arccos im Debugger markiert, kann das der Fall sein? ;-)
Auch das siehst du ja dann bei ShowMessage, wenn die erste eben gar nicht erst kommt...
perry5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102



BeitragVerfasst: So 07.01.07 23:11 
Ok, ich hab halt ne Abrage, das das Ergebnis angezeigt werden soll, wenns gößer als 1 oder kleiner als -1 ist.
Es wurde -1 angezeigt.

Ich dneke, es leigt ganz einfach daran, das das normalieiseren kleinere Ungenauigkeiten hatte (die Unvermeidbar waren) und dadruch aus dem korrekten Ergebnis -1 eine -1.0000000000000000000000000001 wurde -> Error im Skalarprodukt.

Ich werde das mal ausgrenzen und aus allem >1 1 machen, und bescheid sagen was sich getan hat.

Das wäre nämlich mal eine vernünftige Erklärung.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: So 07.01.07 23:53 
Hmm .. du solltest mal folgenden Code ausführen und sehn, ob dir das nicht zu denken gibt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    x := 20.3 - 20//x=0.3?
    x := x - 0.3;   //x=0.3 - 0.3 = 0!
    If x <> 0.0 Then
        showmessage('Asd');

...kleinere Ungenauigkeiten sind beim Umgang mit Gleitkommavariablen wirklich ...unumgänglich. Es ist unwahrscheinlich, dass du einen Gleitkommawert genau auf 1, 0 oder sonstwas bekommst ;>

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.