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
GELÖST!

Ergebnis ist nicht Null

FStudzinski
Graphisoft Partner
Graphisoft Partner

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.

 

wert1=1.2-0.025*2+0.005

text2 0,0,wert1
add2 0,-1
 
wert2=21*0.055
text2 0,0,wert2
add2 0,-1

wert3=wert1-wert2
text2 0,0,wert3
 
Gruß
 
Frank

 

Operating system used: Windows

FST
1 AKZEPTIERTE LÖSUNG

Akzeptierte Lösungen
Lösung
runxel
Legend

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.

 

 

 

Lucas Becker | AC 27 on Mac | Graphisoft Insider Panelist | Author of Runxel's Archicad Wiki | Editor at SelfGDL | Developer of the GDL plugin for Sublime Text | My List of AC shortcomings & bugs | I Will Piledrive You If You Mention AI Again |

POSIWID – The Purpose Of a System Is What It Does /// «Furthermore, I consider that Carth... yearly releases must be destroyed»

Lösung in ursprünglichem Beitrag anzeigen

3 ANTWORTEN 3
Lösung
runxel
Legend

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.

 

 

 

Lucas Becker | AC 27 on Mac | Graphisoft Insider Panelist | Author of Runxel's Archicad Wiki | Editor at SelfGDL | Developer of the GDL plugin for Sublime Text | My List of AC shortcomings & bugs | I Will Piledrive You If You Mention AI Again |

POSIWID – The Purpose Of a System Is What It Does /// «Furthermore, I consider that Carth... yearly releases must be destroyed»
FStudzinski
Graphisoft Partner
Graphisoft Partner

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

FST
torben_wadlinger
Virtuoso

@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.

Setup info provided by author