abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
Programmierung
Alles über Programmierung in GDL und Python

EPS = 0.0001...?????

Hmooslechner
Rockstar
Wie geht Ihr eigentlich mit der Fehlermeldung um, die man bekommt, wenn man einem Array zB.hypotenuse3D eine reale Zahl zuordnet, um Divisionen durch Null zu verhindern.

 
EPS1 = 0.0001


hypotenuse2D[i] = sqr((x[i+1]-x[i])^2 +(y[i+1]-y[i])^2) !!Distanz Jetzt - Nächster
hypotenuse3D[i] = sqr(hypotenuse2D[i]^2 + (z[i+1]-z[i])^2) !!3D

if z[i+1] = 0 then z[i+1] = EPS1
if z[i] = 0 then z[i] = EPS1
if y[i+1] = 0 then y[i+1] = EPS1
if y[i] = 0 then y[i] = EPS1


beta = ((x[i+1]-x[i])/hypotenuse2D[i]) !!Division - möglicherweise durch 0 - mit EPS verhindert



Bei diesem Beispiel wird ja durch null dividiert, wenn Z null ist. - Dann gibts ja eine Fehlermeldung - was ja ganz ok ist .

Um dies zu verhindern legt man eben bei hypotenuse3D =0 fest, dass eben nicht ganz null reingeschrieben wird. Ist sehr "dirty - Aber wie löst Ihr das?

Man bekommt dann eben folgende Warnung:

"Die Verwendung von realen Typen kann zu Präzisionsproblemen führen bei Zeile..." - Was ja auch stimmt, aber in so einem Fall ja beabsichtigt ist. Kann man die Meldung eigentlich abschalten? Oder sonstwie umgehen, weil somit der "Debugger" (falls man das so nennen soll) fast sinnlos wird. Besonders bei Programmen, die solches EPS dann oft benötigen..
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
11 ANTWORTEN 11
Hmooslechner
Rockstar
Was auch nervt.. Es scheint so, dass ab einer gewissen Länge des Scripts der Debugger nicht an der richtigen Zeile stehenbleibt, oder eben keine Bildschaltung dort hinspringt. Man schaut ins "Leere", muss den Debugger nochmals starten, alle Präzisionsmeldungen durchklicken, bis endlich der echte Fehler wieder angezeigt wird, sich die Zeilennummer merken und dann mit der Zeilensuche STRG + L die entsprechende Zeile finden und aus der Meldung schlau werden..

N E R V T W I R K L I C H ! 😐

Bin ich da echt alleine?
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
Anonymous
Nicht anwendbar
Hallo Heimo,

zu Deinem ersten Beitrag: Du beschreibst 2 Probleme:

a) Verhinderung der Division durch Null, das muss man irgendwie abfangen,
z.B. so wie Du es beschrieben hast.
Frank macht es so: if divisor then a = b / divisor else a = a, ich ähnlich.

b) "Die Verwendung von realen Typen kann zu Präzisionsproblemen führen bei Zeile..."
Das hat mich am Anfang auch genervt, ist aber eine Konsequenz von Graphisoft, saubereres Scripten zu ermöglichen.
Man schreibt jetzt halt nicht mehr:
IF a = 0.5 THEN ...
sondern
IF ABS(a - 0.5) < eps THEN ...
Da habe ich mich schon lange dran gewöhnt.
Hmooslechner
Rockstar
Danke - man ist einfach irgenwann betriebsblind...
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
Hmooslechner
Rockstar
Habe jetzt eine andere Möglichkeit gefunden, die ohne EPS auskommt:

Wenn man mit editierbaren Hotspots arbeitet, kommt man früher oder später auf den Gedanken, Zustandsschalter damit herzustellen - aber oft ist 0 oder 1 viel zu groß im Symbol.
Um die Schrittdistanz für den Hotspot einzuschränken, legt man mit values einen wesentlich kleineren Zustand fest:



values "SKLinSchalter" 0, 0.03 !! somit sind nur diese beiden Zustände möglich



0,003 ist eine vielleicht Schaltergröße für kleine Bauteile, bei denen der User irgendwas ein-Ausschalten kann, ohne den Schalter viel zu weit rausrücken muss.

Dann kommt irgendwann der Code für den Schalter:


HOTSPOT2 0, 0, hsid, SKLinSchalter, 1 :hsid=hsid+1
HOTSPOT2 0, -1, hsid, SKLinSchalter, 3 :hsid=hsid+1
HOTSPOT2 0, SKLinSchalter, hsid, SKLinSchalter, 2 :hsid=hsid+1


Wenn ma nun direkt den Schalter abfragen würde, gäbe es die Meldung:

"Die Verwendung von realen Typen kann zu Präzisionsproblemen führen bei Zeile..."

Wenn man aber den Schalter in einen String umwandelt und diesen abfragt - gehts problemlos:

			

TestungSchalter = str(SKLinSchalter, 5, 3)
if TestungSchalter = "0,003" then "mach irgendwaswas"



Trotzdem wäre es schön, wenn Archicad bei Hotspots eine dezitierte Schalterfunktion anbieten würde, die mit der Skalierung der Darstellung im Zeichnungseditor mitwandert oder anstatt des Vektors eine Abfrage-Petpal aufpoppt.
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
Anonymous
Nicht anwendbar
Die Umwandlung in string und dann abfagen ist nicht wirklich eine Lösung und auf keinen Fall besser als die EPS-Lösung (die auch nicht gut ist).
Hmooslechner
Rockstar
Deine Alternative?
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
Anonymous
Nicht anwendbar
Hat doch Jochen schon geschrieben:

IF ABS(SKLinSchalter - 0.003) < eps THEN ...
Hmooslechner
Rockstar
Ist genauso eine Umwandlung - nur mit EPS eben in einen Absolutwert. Nicht besser - nicht schlechter - nur eine Alternative.
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
Anonymous
Nicht anwendbar
Doch, besser: Hier wird nix umgewandelt. Du prüfst eine Variable auf ihren Wert. Und wandelst sie nicht typenfremd um. Und brauchst noch eine Variable. Ist eine Frage des guten Programmierstils. Außerdem sind Strings ind manchen Programmiersprachen ein Speicher- und Leistungsfresser. Bei GDL kann ich das allerdings nicht beurteilen.

Keine Antwort gefunden?

Andere Beiträge
im Board ansehen

Zurück zum Board

Neueste Lösungen durchsuchen

Akzeptierte Lösungen zeigen

Eine neue Diskussion starten!

Neues Thema erstellen