Tutorial
Runden in FreeBASIC
von ytwinky | Seite 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?
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|