2024-10-21 06:35 PM - bearbeitet 2024-10-21 06:58 PM
Moin,
was habe ich da vergessen oder falsch gemacht?
Das Ergebniss von Wert3 in diesem Script sollte eigentlich 0 sein, ist aber -2.22045e-...
Muss ich das mit INT berechnen oder geht das eleganter.
Operating system used: Windows
Gelöst! Gehe zu Lösung.
2024-10-21 07:52 PM - bearbeitet 2024-10-22 10:06 PM
Float Arithmetik ist ein Biest.
Das macht nie Spaß, damit zu hantieren (das ist aber kein Fehler von Archicad / GDL, das ist einfach so. Bestimmte Zahlen kann man gar nicht digital abbilden).
Die Frage ist jetzt, was du erwartest, und wozu du das brauchst.
Die Kurzfassung, um nur den Sonderfall Zahlen nahe Null zu behandeln:
EPS = 0.0001
if abs(meinWert) < EPS then meinWert = 0.0
Möchtest du um die Genauigkeit von Gleitkommazahlen generell herumarbeiten:
EPS = 0.001
wert = 0.123456789
ausgabe = round_int(wert/EPS) * EPS
Erklärung:
wert / eps
skaliert den Wert, sodass er in den Bereich von Ganzzahlen fällt (z.B. bei einem Wert 0.0001
als EPS(ilon) wird 0.123456
zu 1234.56
skaliert). Mit der round_int(...)
Funktion wird kaufmännisch auf die nächste Ganzzahl gerundet. Schließlich wird das Ergebnis wieder mit EPS
multipliziert, um auf die ursprüngliche Größenordnung zurückzukommen. Meine Nachkommastellen werden die von Epsilon nicht überschreiten.
2024-10-21 07:52 PM - bearbeitet 2024-10-22 10:06 PM
Float Arithmetik ist ein Biest.
Das macht nie Spaß, damit zu hantieren (das ist aber kein Fehler von Archicad / GDL, das ist einfach so. Bestimmte Zahlen kann man gar nicht digital abbilden).
Die Frage ist jetzt, was du erwartest, und wozu du das brauchst.
Die Kurzfassung, um nur den Sonderfall Zahlen nahe Null zu behandeln:
EPS = 0.0001
if abs(meinWert) < EPS then meinWert = 0.0
Möchtest du um die Genauigkeit von Gleitkommazahlen generell herumarbeiten:
EPS = 0.001
wert = 0.123456789
ausgabe = round_int(wert/EPS) * EPS
Erklärung:
wert / eps
skaliert den Wert, sodass er in den Bereich von Ganzzahlen fällt (z.B. bei einem Wert 0.0001
als EPS(ilon) wird 0.123456
zu 1234.56
skaliert). Mit der round_int(...)
Funktion wird kaufmännisch auf die nächste Ganzzahl gerundet. Schließlich wird das Ergebnis wieder mit EPS
multipliziert, um auf die ursprüngliche Größenordnung zurückzukommen. Meine Nachkommastellen werden die von Epsilon nicht überschreiten.
am 2024-10-21 11:28 PM
Das ganze it ja nur ein Auszug auf einem Script, die Zahlenwerte sind eigentlich variablen. Ist Teil von einem Geländer und berechnet wir der Reste, wenn das gewünschte Rasten nicht aufgeht.
Bei boolean war mir das ja klar, aber das man 0 nicht berechnen kann hatte ich bisher noch nicht wahrgenommen.
Danke für die Nachhilfe Lektion
am 2024-10-26 11:41 PM
@runxel bzgl. Gleitkommazahlen und deren Handhabung in Archicad möchte ich dir gerne widersprechen. Ja, der reelle Zahlenraum hat in der Abbildung innerhalb von Computersystemen Lücken. Aber trotzdem existieren Algebrasysteme, die mit diesen Lücken umgehen können, ohne alles in den Ganzzahl-Bereich verschieben zu müssen. Auch können die verschiedenen C und C#-Bibliotheken das sehr gut. Offensichtlich ist der arithmetische Kern von Archicad so altertümlich, dass alles jenseits von 10^-4 problematisch ist.
Klar, die Baustelle arbeitet bis max. 5 x 10^-3, im Stahlbau auch gerne etwas genauer, aber das ändert nichts daran, dass Linien sich kreuzen müssen und dass Null eben Null ist, und nicht fast Null.
Aber deine Vorgehensweise mit einem Epsilon ist schon die richtige Lösung, wenn es darum geht diese Altertümlichkeiten zu umschiffen.