kann nach 12 rotationen (alle entweder Pi/3 oder der Winkel zwischen zwei Dreiecken eines Tetraeders) mit einer geometry.TAffineMatrix (also 3x3, einfache Genauigkeit) der Rundungsfehler bei etwa Pi/18 liegen?
(ich versuche gerade ein Tetraeder ähnlich dem Sierpinski-Dreieck zu zeichnen, und zwar in einer durchgehenden Linie mittels L-System)
Registriert: Di Aug 09, 2011 07:33 Beiträge: 163
Programmiersprache: C/C++
Ich weiss ja nicht, mit welcher Genauigkeit du Pi verwendest bzw. deine anderen Fehler aber bei einer 32bit Float genauigkeit, würde ich den Wert für etwas zu groß einschätzen... glaube nicht, dass der Rundungsfehler so groß ist. ggf. auf 64bit Genauigkeit umstellen (double) und schauen ob es besser wird.
also der Rungungsfehler ist tatsächlich nicht annähernd so groß. ich habe den Fehler mitlerweile gefunden, und zwar dort, wo ich ihn am wenigsten erwartet hätte: ich habe den Winkel nicht richtig berechnet.
kann nach 12 rotationen (alle entweder Pi/3 oder der Winkel zwischen zwei Dreiecken eines Tetraeders) mit einer geometry.TAffineMatrix (also 3x3, einfache Genauigkeit) der Rundungsfehler bei etwa Pi/18 liegen?
Ist in dem Fall zwar nicht so krass, aber im Prinzip darf es nicht überraschen... Bei Fließkomma darf man sich nicht einmal auf das Vorzeichen verlassen
Code:
10^20-10^20+23-13+222=232
10^20+23-10^20-13+321=308
10^20+23-13-10^20+321=321
10^20+23-13+321-10^20=0
10^20+23+321-10^20-13=-13
Ganz grob ist es so, dass besonders häufig kritisch wird, wenn Du beim addieren/subtrahieren eine echte subtraktion ähnlich großer zahlen machst, z.B. verlierst Du schon durch 0.1234-0.1233=1*10^-4 drei gültige Ziffern. Dividieren gibt große Fehler, wenn Du durch sehr kleine Zahlen dividierst. Beides kann Dir auch schon beim 3x3 Matrizenmultiplizieren passieren. Wenn man natürlich schon verkehrt rechnet hat, geht der relative fehler besonders schnell richtung unendlich
Wenn du Probleme mit Rundungsfehlern hast sind Quaternionen eine Option. Diese verhalten sich wesentlich stabiler als Matrizen. Mit Quaternionen ist es auch kein Problem etwa jedes Frame etwa um "deltaTime" zu drehen. Der resultierende Drehwinkel ist natürlich genauso ungenau, dafür hast du aber keine Probleme mit Matrizen deren Vektoren nicht mehr zueinander orthogonal sind. Das sorgt für fiese Verzerrungen bei deinen Meshes. Einfach hin und wieder das Quaternion mal wieder normalisieren und gut ist.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Möchte an dieser Stelle mal auf den Artikel hinweisen, den Tak neulich verlinkt hat: don't store that in a float (Allgemeine Behandlung des Float-Genauigkeits-Problems und wie man damit am besten umgeht)
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.