Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  PTC Creo Elements/Programmierung
  Winkelfunktion 0.8815421S0 ....S0?

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von Denys an!   Senden Sie eine Private Message an Denys  Schreiben Sie einen Gästebucheintrag für Denys

Beiträge: 39
Registriert: 09.09.2003

OSD 12.01
ME10 10.00
W2k

erstellt am: 14. Okt. 2004 11:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


test.lsp.txt


Boden.lsp.txt

 
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.



Sehen Sie sich das Profil von clausb an!   Senden Sie eine Private Message an clausb  Schreiben Sie einen Gästebucheintrag für clausb

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Denys 10 Unities + Antwort hilfreich

Wenn ich das richtig sehe, werden bei Deinen Berechnungen "short floats" erzeugt, die dann auch als solche markiert werden (durch das "S0"). Siehe dazu auch http://www.lisp.org/HyperSpec/Body/sec_22-1-3-1-3.html. Short floats sind aber nicht aussergewoehnlich und koennen, soweit ich weiss, ganz normal weiterbenutzt werden.

Gibt es denn tatsaechlich Probleme, wenn Du diese Zahlen dann weiter benutzt?

Claus

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Denys
Mitglied
Konstrukteur


Sehen Sie sich das Profil von Denys an!   Senden Sie eine Private Message an Denys  Schreiben Sie einen Gästebucheintrag für Denys

Beiträge: 39
Registriert: 09.09.2003

OSD 12.01
ME10 10.00
W2k

erstellt am: 14. Okt. 2004 14:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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.



Sehen Sie sich das Profil von clausb an!   Senden Sie eine Private Message an clausb  Schreiben Sie einen Gästebucheintrag für clausb

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Denys 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Denys an!   Senden Sie eine Private Message an Denys  Schreiben Sie einen Gästebucheintrag für Denys

Beiträge: 39
Registriert: 09.09.2003

OSD 12.01
ME10 10.00
W2k

erstellt am: 14. Okt. 2004 15:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz