Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Runden in FreeBASIC

von RedakteurytwinkySeite 1 von 4

Tja, auch in der neuesten Version 'fehlt' in FreeBASIC ein Befehl, der Zahlen auf eine bestimmte Anzahl von Nachkommastellen rundet.
Der Befehl ist nicht nötig, weil FreeBASIC ja Double's hat, damit läßt sich doppeltgenau rechnen? Falsch! Die Ergebnisse sind nicht genauer, es werden nur mehr Stellen benutzt. Sehen wir uns mal ein Beispiel aus dem Double-Bereich an:
In einem Dreieck gibt es immer drei Innenwinkel. Die Summe dieser drei Innenwinkel muß immer 180°(=Pi rad) sein. Jetzt kann sich im Laufe der Berechnung herausstellen, daß die Summe 179.9998 oder 180.0002 ist, was nun? Wir könnten uns hinsetzen und sagen:"Paßt scho.."
Nun ist 180° aber ein Sollwert(der stimmen muß), aber welcher der drei Innenwinkel ist nun 'falsch'?
Noch eine grundsätzliche Bemerkung vorweg: In diesem Beispiel hat es natürlich Sinn, mit den gerundeten Werten weiterzurechnen, schließlich erfüllen sie die Winkelsummenbedingung im Dreieck. Wenn wir nun aber Pi auf 2 Stellen rundeten und zur Umrechnung von Winkeln ins Bogenmaß verwenden würden, wären 'leichte Ungenauigkeiten' gewissermaßen vorprogrammiert xD
Vielleicht ist dies ja der Grund, warum es keine vordefinierte Runden-Funktion gibt?
Ein anderes Beispiel:

Dim As Single a=68.50, b=59.05
Dim As Double c=a, d=b
Print a
Print b
Print a-b
Print c
Print d
Print c-d
Sleep

Jedenfalls bedeutet dies, daß wir besonders vorsichtig mit gerundeten Zahlen umgehen müssen!
Es gibt Funktionen, die den ganzahligen Teil(CInt) oder den Nachkommateil(Frac) liefern, aber das ist nicht ganz das, was wir jetzt haben wollen..
Hierzu ein Beispiel aus dem Forum:

6 abgegebene Stimmen=100%
FBEdit 4 Stimmen=66%
FBIde 2 Stimmen=33%
Rest 0 Stimmen=0%
SummaSummarum 99%

Die 33% stammen aus 200/6=33.333..; da kann der Vorkommateil verwendet werden^^
Die 66% stammen aus 400/6=66.6666..; hier wäre es voreilig, nur den Vorkommateil zu berücksichtigen.
Da 0.6666.. aufgerundet wird zu 1, wäre 67% der 'richtige' Wert^^
Wie wurde das Problem 'früher' gelöst? Nun, die zu rundende Zahl wurde mit einem Wert multipliziert, der die Anzahl der Nachkommastellen repräsentierte, als ganze Zahl gerundet und durch den Wert wieder geteilt:

Function Runde(Variable As Double, Nachkomma As Integer) As Double
  Dim Wert As Double=10^Nachkomma 'Der Double-Wert wird zweimal benötigt..
  Return CInt(Variable*Wert)/Wert
End Function
Print "Pi=" &Runde(4*Atn(1), 4) 'na, das sieht bekannt aus..
Print "Pi=";:Print Using"#.######"; Runde(4.0*Atn(1.0), 4) '"endliches" Pi^^
Sleep

Na bitte, das funktioniert tatsächlich, warum auch nicht?
Geht das auch anders?

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 09.10.2007 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 04.09.2010 von Redakteurytwinky gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen