| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für PTC CREO |
Autor
|
Thema: Winkelfunktion 0.8815421S0 ....S0? (1148 mal gelesen)
|
Denys Mitglied Konstrukteur
Beiträge: 39 Registriert: 09.09.2003 OSD 12.01 ME10 10.00 W2k
|
erstellt am: 14. Okt. 2004 11:32 <-- editieren / zitieren --> Unities abgeben:
Hallo, mein Lisp funktioniert doch nicht einwandfrei. Bei bestimmten Eingabekonstellationen wird gibt es Probleme mit den zurückgegebenen Werten aus einer Winkelfunktion. Es wird ein Wert berechnet, der den Cosinus einen Winkels darstellt, Dieser wird anschließend in den Sinus umgemünzt. In einigen Fällen ist der errechnete Cosinus eine irrationale Zahl. Der davon abgeleitete Sinus enthält ein S0 in der 8. Stelle. Angehängt ist ein Ausschnitt aus meinem Boden.lsp, bei der man bei Eingabe Wanddicke =3 bzw. 3.000000001 die Problematik erkennt. Im Boden.lsp tritt der Fehler bei Wahl „Normal gewölbter Boden auf. Wie kann das Problem sauber gelöst werden?
------------------ Gruss Denys Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 14. Okt. 2004 13:40 <-- editieren / zitieren --> Unities abgeben: Nur für Denys
|
Denys Mitglied Konstrukteur
Beiträge: 39 Registriert: 09.09.2003 OSD 12.01 ME10 10.00 W2k
|
erstellt am: 14. Okt. 2004 14:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Claus, bitte check doch mal mein Boden.lsp bei Eingabe Durchm.: beliebig (von mir getestet 1600, 1900, 2000) Wanddicke: 3 Normal gewölbter Boden ! (R2 =100) ==> kein geschlossenes Profil (Übergang R1-R2) für das Drehen Dieses Lisp ist mein erstes Teil. Mein Kenntnistand entspricht nur dem was ich aus den zahlreichen Beispielen auf Heiko's OSD-Seite entschlüsseln konnte. ------------------ Gruss Denys Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 14. Okt. 2004 15:05 <-- editieren / zitieren --> Unities abgeben: Nur für Denys
Tja, so ist das mit den Fliesskommaberechnungen. Offenbar hast Du es in Deinem Code geschafft, Profilpunkte zu erzeugen, die zwar sehr nahe beieinander sind, aber eben doch weiter als 1e-6. Das ist ein sehr allgemeines numerisches Problem; so manches Buch befasst sich eben mit der Frage, wie man Ungenauigkeiten bei numerischen Berechnungen reduzieren kann. Ich bin da sicher auch kein Experte, daher nur ein paar allgemeine Hinweise:
- Im Zweifel mit dem genaueren Datentyp arbeiten, hier also nicht mit "short floats", sondern mit doppelt genauen Fliesskommazahlen. Siehe den Link in meiner vorigen Nachricht.
- Wo es immer geht, Fliesskommaberechnungen vermeiden. Manchmal kann man Teile der Berechnung beispielsweise als Ganzzahlarithmetik ausfuehren.
- Aufpassen beim Kombinieren von Fliesskommazahlen stark unterschiedlicher Groessenordnungen in einem Term. (Moeglichst vermeiden.)
- "Epsilontik" verwenden, vor allem bei Vergleichen von Fliesskommazahlen. Siehe dazu die Diskussion von neulich unter http://ww3.cad.de/foren/ubb/Forum15/HTML/000869.shtml
- Algorithmen einsetzen, die zu erkennen versuchen, wann zwei numerisch verschiedene Punkte tatsaechlich einen einzigen Punkt repraesentieren.
In Deinem Fall ist ein Teil des Problems, dass die Division, die zur Berechnung von cos_alpha gemacht wird, auf Integer-Zahlen operiert und dann intern einen "short float" erzeugt. Wenn man den im folgenden weiterbenutzt, erzeugt er groessere Ungenauigkeiten als noetig. Insofern hast Du Deinen Finger schon auf eine der richtigen Stellen gelegt. Ein trivialer Workaround-Vorschlag fuer diesen Fall: Du koenntest die Division als Fliesskommaberechnung ablaufen lassen (indem Du beispielsweise statt der Konstanten 2 eine 2.0 verwendest) oder aber das Ergebnis am Ende mit der Funktion (float) in einen genaueren Datentyp ueberfuehren. Beides ist aber keine Garantie dafuer, dass es nicht noch beliebig viele Kombinationen von Eingabewerten gibt, bei denen Dein Algorithmus nicht funktioniert. Claus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Denys Mitglied Konstrukteur
Beiträge: 39 Registriert: 09.09.2003 OSD 12.01 ME10 10.00 W2k
|
erstellt am: 14. Okt. 2004 15:33 <-- editieren / zitieren --> Unities abgeben:
Claus, besten Dank für deine ausführlichen Hinweise. Deinen Ausführungen leuten selbst mir ein. Hinsichtlich der Formulierung von Fehlerbehandlung (Eingabekontrolle und Abbruchbedingungen) werde ich mich mit Lisp weiter beschäftigen. Nachdem das Programm nun läuft, vielleicht gewinne ich ja mal eine Lisp-Schulung von meinem Arbeitgeber.;-) Nochmals Danke. ------------------ Gruss Denys Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|