Language Fundamentals/de

(Difference between revisions)
Jump to: navigation, search
(Single-Precision Examples)
(Single-Precision Beispiele)
Line 1,180: Line 1,180:
 
<span style="font-family: Arial;">&nbsp;</span>
 
<span style="font-family: Arial;">&nbsp;</span>
  
1/10 ist eine sich immer wiederholender Nachkommaanteil im binären System. Die Mantisse liegt nahe dem Wert von 1,6 und der Exponent besagt, dass 1,6 durch 16 geteilt werden soll (es ist 011 1101 1 in binären Darstellung, also 123 in Dezimalzahl). Der wahre Exponent ist 123 - 127 = -4 was bedeutet, dass der Faktor für die Multiplikation 2^-4 = 1/16 beträgt. Beachten Sie, dass die gespeicherte Mantisse in dem letzten Bit gerundet ist. Dies ist ein Versuch eine nicht darstellbare Zahl so genau wie möglich darzustellen. (Der Grund, dass 1/10 und 1/100 binärer nicht exakt dargestellt werden können ist ähnlich dem, dass 1/3 nicht exakt im dezimalen System dargestellt werden kann. Dies ergibt eben eine unendliche Periode von 3 --> 0,3333...)
+
1/10 ist ein sich immer wiederholender Nachkommaanteil im binären System (periodischer Teilungsrest). Die Mantisse liegt nahe dem Wert von 1,6 und der Exponent besagt, dass 1,6 durch 16 geteilt werden soll (es ist 011 1101 1 in binären Darstellung, also 123 in Dezimalzahl). Der wahre Exponent ist 123 - 127 = -4 was bedeutet, dass der Faktor für die Multiplikation 2^-4 = 1/16 beträgt. Beachten Sie, dass die gespeicherte Mantisse in dem letzten Bit gerundet ist. Dies ist ein Versuch eine nicht darstellbare Zahl so genau wie möglich darzustellen. (Der Grund, dass 1/10 und 1/100 binärer nicht exakt dargestellt werden können ist ähnlich dem, dass 1/3 nicht exakt im dezimalen System dargestellt werden kann. Dies ergibt eben eine unendliche Periode von 3 --> 0,3333...)
  
  

Revision as of 15:07, 20 February 2013

Label, Schlüsselwörtern, Variablen und Operatoren bestehen aus Zeichen des BASCOM-Zeichensatzes.

Diese wiederum werden zusammengesetzt zu dem, was ein Programm ausmacht.

Dieses Kapitel beschreibt die Zeichen und das Format von BASCOM Programmzeilen.  

Insbesondere beschreibt es:

 

 

die spezielle Bedeutung von Zeichen des Zeichensatzes und besondere Bedeutung einiger Zeichen
das Format einer BASCOM Programmzeile
Zeilen LABELs
Programm Zeilenlänge

 

 

 

Contents

Zeichensatz

 

The BASCOM BASIC character set consists of alphabetic characters, numeric characters, and special characters.

The alphabetic characters in BASCOM are the uppercase letters (A-Z) and lowercase letters (a-z) of the alphabet.

 


Der BASCOM BASIC Zeichensatz besteht alphabetischen Zeichen, numerischen Zeichen und Sonderzeichen. Die alphabetischen Zeichen sind die Zeichen A bis Z in Großschreibung und die Zeichen a bis z in Kleinschreibung.

Die BASCOM numerischen Zeichen sind die Zahlen von 0 bis 9. Die Zeichen A bis H können ebenfalls zur Darstellung hexadezimaler Zahlen verwendet werden. (A-F und &H zur Kennzeichnung einer hexadezimalen Zahl) .

Die folgenden Zeichen haben spezielle Bedeutungen in BASCOM Anweisungen und Ausdrücken: 

 

Character

Name

ENTER

Abschluss einer Engabezeile

 

Leerzeichen ( oder Space)

'

einfaches Anführungszeichen (Apostroph)

*

Stern (Multiplikation Symbol)

+

Plus Zeichen

,

Komma

-

Minus Zeichen

.

Punkt (Dezimalpunkt)

/

Schrägstrich (Slash) (Division Symbol) wird wie \ behandelt

 :

Doppelpunkt

"

doppelte Anführungszeichen

 ;

Semikolon

<

kleiner als

=

Gleichheitszeichen (Zuweisungssymbol or relationaler Operator)

>

größer als

\

Schrägstrich rückwärts (Backslash) (Division Symbol)

^

Exponent

 

 

 

Die BASCOM Programmzeile

BASCOM Programmzeilen haben folgende Syntax:

 

 

[[Line-identifier]] [[Statement]] [[:Statement]] ... [[Comment]]

 

 

Sprungmarken (Label)

BASCOM unterstützt alphanumerische Sprungmarken (Label).

 

 

Ein Label besteht aus 1 bis 32 Buchstaben oder Zahlen. Sie beginnen mit einem Buchstaben und enden mit einem Doppelpunkt.

BASCOM Schlüsselwörter sind nicht erlaubt. (z.B. print:)

 

Beispiele zu gültigen Label:

 

Alpha:

ScreenSUB:

Test3A:

 

Groß- Kleinschreibung wird nicht unterschieden. Folgende Beispiele zeigen unterschiedliche Schreibweisen, stehen aber für ein und dasselbe Label.

 

alpha:

Alpha:

ALPHA:

 

 

Label können an einer beliebigen Stelle in einer Zeile beginnen, so lange sich links vom Label lediglich Leerzeichen befinden.

Leerzeichen innerhalb des Label Namen und zwischen Label Name und dem abschließenden Doppelpunkt sind nicht erlaubt.

In einer Zeile darf sich nur ein Label befinden. In einer Zeile mit einem Label darf sich nur dieses Label befinden, also keine weiteren Anweisungen oder Instruktionen oder Ausdrücke. Ein Label ist der einzige Ausdruck in einer Zeile. (z.B. NICHT Label: print hier muss die Print Anweisung in der folgenden Zeile stehen)

 

 

BASCOM Anweisungen (Befehle)

Eine BASCOM Anweisung ist entweder "ausführbar" oder "nicht ausführbar".

Eine ausführbare Anweisung (Befehl) führt Schritte in der Programmlogik aus. Ein Beispiel eines ausführbare Befehl ist "Print". Hier wird der Befehl zur Ausgabe von Daten gegeben.

Nicht ausführbare Anweisungen dienen z.B. der Speicherzuweisung, Deklaration oder Definition des Types von Variablen.

 

Im folgenden Beispiele für "nicht ausführbare Anweisungen"

REM (Startet eine Kommentierung)
DIM (legt den Typ einer Variablen fest)

 

 

Eine Kommentierung (Comment) ist eine "nicht ausführbare Anweisung" und dient dazu Schritte im Programm zu beschreiben oder verdeutlichen. Verwenden sie gerade zu Beginn viele Kommentierungen, damit sie sich selbst den Sinn und Zweck von Befehlszeilen verdeutlichen.

Eine Kommentierung wird eingeleitet mit dem Befehl (REM) oder einem einfachen Anführungszeichen ('). Solch eine Kommentierung hat lediglich in der betreffenden Zeile Gültigkeit. (siehe auch Blockkommentierung)

Die folgenden Zeilen bewirken das gleiche:

 

PRINT " Quantity remaining" : REM Print report label.
PRINT " Quantity remaining" ' Print report label.

 

Es können mehrere BASCOM Befehle in einer Zeile stehen, diese müssen aber mit einem Doppelpunkt von einander getrennt sein, wie nachfolgendes Beispiel zeigt.

 

FOR I = 1 TO 5 : PRINT " Gday, mate." : NEXT I

 

 

BASCOM Zeilenlänge

Wenn sie den BASCOM eigenen Editor benutzen, ist die Länge einer Zeile nicht beschränkt. Zur besseren Übersicht wird aber dazu geraten, die Zeile auf 80 Zeichen zu beschränken.

 

 

Datentypen

Jede BASCOM Variable ist einem Datentyp zugeordnet. Hiervon hängt ab, was in einer Variablen gespeichert werden kann. Der nächste Abschnitt beschreibt die elementaren Datentypen.

 

 

 

Elementare Datentypen

 

Bit (1/8 Byte). Ein BIT kann nur genau eine Informationseinheit speichern. Dies ist entweder eine 0 oder eine 1. Eine Gruppe von 8 Bit nennt man 1 BYTE.
Byte (1 Byte).  Bytes werden als "unsigned" (vorzeichenlos) 8-Bit Werte gespeichert. Ein Byte kann eine natürliche Zahl im Bereich von 0 bis 255 darstellen. (nicht negative ganze Zahl)
Integer (zwei Byte). Integer wird als "signed" (vorzeichenbehaftet) 16-Bit binäre Zahl gespeichert. Der darstellbare Zahlenraum liegt hierbei von -32.768 bis +32.767
Word (zwei Byte). WORD wird als "unsigned" (vorzeichenlos) 16-Bit Werte gespeichert. Ein Word kann eine natürliche Zahl im Bereich von 0 bis 65535 darstellen.
Dword (vier Byte). DWORD wird als "unsigned" (vorzeichenlos) 32-Bit Werte gespeichert. Ein DWord kann eine natürliche Zahl im Bereich von 0 bis 4294967295 darstellen.
Long (vier Byte). Integer wird als "signed" (vorzeichenbehaftet) 32-Bit binäre Zahl gespeichert. Der darstellbare Zahlenraum liegt hierbei von -2147483648 bis 2147483647.
Single (vier Byte). Singles wird als "signed" (vorzeichenbehaftet) 32-Bit binäre Zahl gespeichert. Der darstellbare Zahlenraum liegt hierbei von 1.5 x 10^–45 bis 3.4 x 10^38
Double (acht Byte). Double wird als "signed" (vorzeichenbehaftet) 64-Bit binäre Zahl gespeichert.Der darstellbare Zahlenraum liegt hierbei von 5.0 x 10^–324 bis 1.7 x 10^308
String (bis zu 254 Byte). String (Zeichenkette) wird als Folge von Bytes gespeichert mit abschließenden Byte mit Wert 0. Ein String mit einer Länge von 10 Zeichen belegt 11 Byte Speicher.

 

Variablen können intern (Standard), extern oder im EEPROM gespeichert werden.

 

 

Variablen

Eine Variable ist ein Name, welcher auf ein Objekt in einem Speicherbereich zeigt

Einer numerischen Variable kann, ihrer Definition entsprechend, nur eine Zahl zugewiesen werden.

Im Folgenden ein paar Beispiele von Variablen Zuweisungen:

 

Einen konstanten Wert zuweisen:

A = 5

C = 1.1

 

Den Wert einer anderen Variable einer Variable zuweisen:

abc = def

k = g

 

Den Wert durch die Kombination von anderen Variablen, Konstanten und Operatoren erhalten: Temp = a + 5

Temp = C + 5

 

Den Wert durch Aufruf einer Funktion erhalten:

Temp = Asc(S)

 

 

Variablen Namen

Ein BASCOM Variablen Name kann bis zu 32 Zeichen lang sein.

Der Name darf Buchstaben und Zahlen enthalten.

Das erste Zeichen des Namen muss ein Buchstabe sein

 

Ein Variablenname darf kein reserviertes Wort sein, aber kann es beinhalten.

Die Anweisung im folgenden Beispiel ist nicht erlaubt, da AND ein reserviertes Wort ist:

 

AND = 8

 

Die Anweisung im folgenden Beispiel ist gültig:

 

ToAND = 8

 

 

Reservierte Wörter umfassen alle BASCOM Befehle, Ausdrücke, Funktion, interne Register und Operatoren.

(siehe BASCOM Reservierte Wörter, für eine Liste mit allen reservierten Wörtern).

 

Hexadezimal Zahlen werden mit &H angegeben. Binäre Zahlen werden mit &B angegeben.

a = &HA , a = &B1010 and a = 10 weist der Variablen das Gleiche zu.

 

Vor der Benutzung einer Variable, muss diese dem Compiler durch eine  DIM  Anweisung bekannt gemacht werden.

Dim b1 As Bit, I as Integer, k as Byte , s As String * 10

 

Bei dem Variablentyp STRING muss zusätzlich die Länge des String angegeben werden

 

 

Ebenfalls möglich: DEFINTDEFBITDEFBYTE ,DEFWORD ,DEFLNG or DEFSNG.

 

Beispiel: DEFINT c teilt dem Compiler mit, dass alle undefinierten Variablen welche mit dem Zeichen "c" anfangen, vom Typ INTEGER sind.

 

 

Ausdrücke und Operatoren

Dieses Kapitel beschreibt, wie man Ausdrücke und Operatoren in BASCOM anwendet.

 

Bei jeder Berechnung werden Ausdrücke und Operatoren verwendet.

 

Dieses Kapitel beschreibt, wie Ausdrücke gebildet werden und schließt mit der Beschreibung der Art von Operatoren:

 

Arithmetische Operatoren, werden für Berechnungen verwendet.
Verhältnis (Relational) Operatoren, Vergleich von numerischen oder auch String Variablen.
Logische Operatoren, Testen von Bedingungen oder Veränderung von Bits.
Funktions Operatoren, zur Ergänzung der einfachen Operatoren.

 

 

 

Expressions and Operators

 

Ein Ausdruck kann eine numerische Konstante, eine Variable oder ein einzelner Wert durch die Kombination von Konstanten, Variablen und andere Ausdrücken mit Operatoren sein.

 

Operatoren führen mathematischen oder logischen Operationen an Werten durch.

Die von BASCOM zur Verfügung stehenden Operatoren sind in vier Gruppen einzuordnen:

 

1. Arithmetisch

2. Verhältnis (Relational)

3. Logisch

4. Funktionen

 

 

Arithmetic

Arithmetische Operatoren sind +, - , * , \, / und ^.

 

Integer

Integer Division wird durch den Schrägstrich rückwärts (\)(Backslash) dargestellt.

Beispiel: Z = X \ Y

 

Modulo Arithmetik

Modulo Arithmetik wird mit MOD durchgeführt.

Eine Modulo Arithmetik ergibt den Teilungsrest einer ganzzahligen Division.

 

Beispiel: X = 10 \ 4 : Teilungsrest= 10 MOD 4

 

Overflow und "Division by zero" (Überlauf und Teilung durch 0)

"Division by zero" oder Teilung durch 0, erzeugt einen Fehler.

Hierbei findet keine Fehlerausgabe statt, sie müssen selbst dafür Sorge tragen, dass dies nicht eintreten kann.

 

 

Relationale Operatoren (Verhältnis Operatoren)

Relationale Operatoren werden verwendet, um zwei Werte miteinander zu vergleichen. Die Operatoren sind in folgender Tabelle aufgelistet.

Das Ergebnis kann verwendet werden, um den Programmablauf zu steuern.

 

Operator

Vergleich

Ausdruck

=

gleich

X = Y

<>

unterschiedlich

X <> Y

<

kleiner als

X < Y

>

größer als

X > Y

<=

kleiner oder gleich

X <= Y

>=

größer oder gleich

X >= Y

 

 

Logische Operatoren

Logische Operatoren prüfen Bits, manipulieren Bits oder sind boolsche Operatoren.

Es gibt in BASCOM vier logische Operatoren :

 

Operator

Bedeutung

NOT

Logisches Komplementär

AND

logisches UND

OR

logisches ODER

XOR

Exclusiv ODER (Exclusive or)

 

Es ist möglich logische Operatoren zu verwenden, um Bytes auf Bitmuster zu testen.

Zum Beispiel kann der AND Operator dazu benutzt werden, alle bis auf ein BIT auszumaskieren. Der OR Operator kann dazu benutzt werden, um zwei Bytes zu einem neuen Wert zusammen zu fassen.

 

 

Beispiel

= 63 And 19
PRINT A
= 10 Or 9
PRINT A

 

 

Ausgabe

19

11

 

 

 

Fließkomma SINGLE (4 BYTE)(gezeigter ASM Programmcode wurde zur Verfügung gestellt von Jack Tidwell)

SINGLE Zahlen entsprechen dem IEEE binäre Fließkomma-Standard.

Ein Acht-Bit-Exponent und 24 Bit Mantisse werden unterstützt.

Bei Verwendung von vier Byte ergibt sich folgendes Ergebnis:

 

 

31 30________23 22______________________________0

 

s Exponent Mantisse

 

 

Der Exponent wird durch 128 vorgeladen. Oberhalb 128 sind positive Exponenten, unterhalb sind Negative. Das Vorzeichenbit für positive Zahlen ist 0 und 1 für Negative. Die Mantisse wird in einem versteckten Bit in normalisiertem Format gespeichert, so dass 24 Bits Präzision erreicht werden.

 

Alle mathematischen Operationen werden durch SINGLE unterstützt

Sie können einen SINGLE zu einem INTEGER oder WORD konvertieren oder anders herum.

 

Dim I as Integer, S as Single

 

S = 100.1 'Ein SINGLE zuweisen

I = S  'Konvertiert den SINGLE zu einem WORD

 

 

Hier ein Auszug aus der "Microsoft knowledge base" über FP (Fließkomma):

 

Floating-point mathematics is a complex topic that confuses many programmers. The tutorial below should help you recognize programming situations where floating-point errors are likely to occur and how to avoid them. It should also allow you to recognize cases that are caused by inherent floating-point math limitations as opposed to actual compiler bugs.

 

 

 

Dezimale und binäre Zahlensysteme

Normalerweise rechnen wir im 10er Zahlensystem Die Basis 10 ist dabei völlig willkürlich gewählt. Der einzige Grund mit der Basis von 10 zu rechnen ist, das Menschen mit ihren 10 Fingern arbeiteten um Berechnungen durchzuführen.

Zur Verdeutlichung: Rechnen in einem Zahlensystem mit der Basis 10 bedeutet, dass ein Übertrag zur nächsten Stelle nach der Verwendung der 10 möglichen Zeichen stattfindet. Der Zeichenvorrat im Dezimalsystem ist also 10. (0,1,2,3,4,5,6,7,8,9) Die Wertigkeit der Stellen ist demnach: 1, 10, 100, 1000 und so weiter. Ein negativer Exponent, z.B. 10^-1 stellt den Nachkommawert dar. 10^-1 ist hiernach 1/10, 10^-2 = 1/100, 10^-3 = 1/1000 usw.

Die Zahl 101 im Dezimalsystem drückt folgendes aus: (1 * 100) + (0 * 10) + (1 * 1) = 101 (dezimal)

Im Binärsystem (Zweierzahlensystem) ist der Zeichenvorrat genau zwei Zeichen groß: 0 und 1. Nach der Verwendung der 1, erfolgt bereits ein Übertrag zur nächsten Stelle. Hier ist die Wertigkeit der Stellen: 1, 2, 4, 8, 16 und so weiter. Ein negativer Exponent, z.B. 2^-1 stellt den Nachkommawert dar. 2^-1 ist hiernach 1/2, 10^-2 = 1/4, 10^-2 = 1/8 usw.

Die Zahl 101 im Binärsystem drückt folgendes aus: (1 * 4) + (0 * 2) + (1 * 1) = 101 (binär) = 5 (dezimal)

 

 

Die dezimale Darstellung der Zahl 532,25 sieht wie folgt aus:

 

(5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)

 

500 + 30 + 2 + 2/10 + 5/100

_________

 

= 532.25

 

 

Im binären Zahlensystem ist die Basis 2, im Gegensatz zum dezimalen, wo die Basis 10 lautet. Darstellung der Zahl 101,01 im Binärsystem:

(1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)

4 + 0 + 1 + 0 + 1/4

_________

= 5.25 Decimal

 

 

Wie INTEGER in Rechnern dargestellt werden

 


Da es keinen Bruchteil (Nachkommawert) bei INTEGER gibt, ist die Darstellung sehr viel einfacher als für Fließkommazahlen. Es handelt sich also um ganze Zahlen. Normalerweise sind INTEGER in Rechnern zwei BYTE (16 BIT) groß. Das höchstwertige BIT zeigt das Vorzeichen an (positive oder negative Ganzzahl). neben einem INTEGER gibt es auch einen LONGINTEGER, welcher vier Byte umfasst.

 

Positive Zahlenwerte sind einfache binäre Zahlen. Zum Beispiel:

 

 

1 dezimal = 1 binär

2 dezimal = 10 binär

22 dezimal = 10110 binär, usw.

 

Negative INTEGER werden durch das Zeierkomplement dargestellt. Um das Zweierkomplement einer negativen Zahl zu erhalten, wird die Zahl zunächst binär als positive Ganzzahl im INTEGER dargestellt. Danach werden alle BITs des INTEGER umgekehrt. Als letzten Schritt wird der Wert 1 addiert.


 

 

4 dezimal = 0000 0000 0000 0100

 

1111 1111 1111 1011 Alle Bits umkehren (Flip the Bits)

 

-4 = 1111 1111 1111 1100 Zahl 1 addieren (Add 1)

 

 

Bei der Addition zweier Zahlen im Zweier-Komplement kommt immer das richtige Ergebnis heraus -  

auch wenn eine oder beide Zahlen negative Zahlen darstellen.

 

 

Fließkomma Zahlenfehler

Jeder dezimal INTEGER Wert (rationale Zahl!) kann exakt Binär dargestellt werden. Dies gilt nicht für Fließkomma Zahlen (irrationale Zahl)! Eine irrationale Zahl ist eine reelle Zahl, die keine rationale Zahl ist. Eine irrationale Zahl ist dadurch gekennzeichnet, dass sie kein Verhältnis von ganzen Zahlen ist. Eine reelle Zahl heißt irrational, wenn sie nicht als Bruch zweier ganzer Zahlen dargestellt werden kann. Eine bekannte irrationale Zahl ist PI.

Merke: Jede irrationale Zahl im Dezimalsystem ist auf in jedem anderen Zahlensystem irrational!

 

Für das Binärsystem im Besonderen gilt: Jede Bruchteil einer ganzen Zahl ("Nachkommawert"), in der Form p/q (wobei q eine ganzzahlige Potenz von 2 ist), kann exakt dargestellt werden mit einer endlichen Anzahl von BIT.


 

Auch Dezimalbrüche wie 1/10000 oder 0,0001 können Binär nicht exakt dargestellt werden. Hierbei liegt die Periode bei 104 BIT (periodische Wiederkehr von Teilungsbrüchen).

 

 

Dies erklärt, warum bei diesem einfachen Beispiel...

 

SUM = 0
FOR I% = 1 TO 10000
 SUM = SUM + 0.0001
NEXT I%
PRINT SUM ' Theoretically = 1.0.

 

 

1.000054 ausgegeben wird. Ein kleiner Fehler macht sich bei der Darstellung der Summierung von 0.0001 bemerkbar!

 

 

Aus diesem Grund sollten sie sehr vorsichtig mit dem Vergleich reeller Zahlen umgehen. Das folgende Beispiel zeigt einen häufig begangenen Programmierfehler:

 

 

item1# = 69.82#

item2# = 69.20# + 0.62#

IF item1# = item2# then print "Equality!"

 

 

Dies wird NICHT "Equality!" (GLEICH) AUSGEBEN, weil 69.82 im Binärsystem nicht exakt dargestellt werden kann. Der Wert der binären Berechnung unterscheidet sich also geringfügig von dem direkt zugewiesenen Wert. In der Praxis sollten sie diesen Vergleich mit einer gewissen Toleranz ausführen.

 

 

 

Allgemeine Fließkommazahlen Konzepte

Es ist sehr wichtig zu verstehen, dass jedes Fließkommazahlen System nur eine endliche Anzahl von Fließkommazahlen exakt darstellen kann. Alle anderen Werte müssen zum nächstmöglichen darstellbaren Wert angenähert werden. Der IEEE Standard definiert die Methode zum nächstmöglichen darstellbaren Wert. BASCOM unterstützt diesen Standard und rundet nach den IEEE Spezifikationen.

 

Denken sie bitte auch daran, dass Zahlendarstellungen nach dem IEEE Standard eine große Streuung beinhalten können. Es gibt eine hohe Genauigkeit im Bereich zwischen 1,0 und -1,0, aber je näher sie sich der 0 oder der Unendlichkeit annähern, je ungenauer wird das Ergebnis sein.

 

Der Vorteil des IEEE Standard, welcher für technische Berechnungen konzipiert wurde ist, die Genauigkeit zu maximieren (so nah als möglich dem richtigen Ergebnis zu sein). Präzision ist hier gleichbedeutend der Anzahl der darstellbaren Stellen. Der IEEE Standard empfiehlt hier eine Balance zwischen den BITs für den Exponent und den BITs für den Nachkommaanteil zu finden, um sowohl Genauigkeit als auch Präzision in akzeptablen Grenzen zu halten.

 

Erläuterung zur Exponentialdarstellung:

Praktisch alle Mikroprozessoren beherrschen zunächst nur den Umgang mit ganzen Zahlen, den sogenannten Integer-Zahlen.

Bei der Speicherung einer Fließkommazahl im binären System, muss das Komma zusammen mit der eigentlichen Zahl gespeichert werden. Das Komma ist keine feststehende Position innerhalb einer beliebigen Fließkommazahl. Beispiel hierzu: 0,12 1234,5 Die eigentliche Zahl einer Fließkommazahl ist die reine Ziffernfolge der Zahl, ohne das Komma. Man nennt sie auch Mantisse. Beispiel: 123,45 --> Mantisse 12345 Die Kommastellung zur Mantisse relativ zur Mantisse wird durch einen Exponenten angegeben. Bei negativen Exponenten wird das Komma nach links verschoben, positive Exponenten verschieben das Komma nach rechts.


Merke: Eine Zahl mit Komma ist also durch zwei ganze Zahlen dargestellt.


Einen EURO Betrag von 12,34 kann man also durch die Mantisse 1234 und den Exponenten -2 abspeichern. Bei diesem Beispiel würden wir aber bei Exponent=0 implizieren, dass das Komma hinter der letzten Ziffer (also am rechten Ende) der Mantisse stehen würde.


In der Praxis verwendet man allerdings eine "normalisierte Darstellung". Dabei steht das Komma hinter der ersten Stelle, welche ungleich 0 ist. Diese Darstellung ist als "wissenschaftliche Darstellung" bekannt und wird von jedem Taschenrechner unterstützt.


Unser obiges Beispiel in wissenschaftlicher Darstellung sieht wie folgt aus: aus 12,34 wird die Mantisse 1,234 und der Exponent 1 (also Komma um eine Stelle nach rechts schieben)

Diese Betrachtung gilt für die Normalisierung einer Dezimalzahl mit dem Zeichenvorrat von 0 bis 9. Demnach könnte die Mantisse einer Dezimalzahl also an der ersten Stelle eine Zahl zwischen 0 und 9 sein.


Anders ist es bei der Darstellung dieser Zahl im binären Zahlensystem. Hier haben wir nur zwei Zeichen zur Verfügung. Nachdem führende Nullen in der Binärzahl keine Bedeutung haben, ist die erste Stelle einer Zahl im Binärsystem bei wissenschaftlicher Darstellung also immer eine 1. Dieser 1 folgt das Komma und weitere Ziffern. Die Mantisse kann nun in zwei Teile zerlegt werden:

- den Vorkommateil (also die führende 1)

- den Nachkommateil (engl. "fraction" oder in deutsch "Bruchteil") auch bezeichnet als Binärbruch


Die Schreibweise „1e9" ist eine Abkürzung für 1 x 10^9, also für den Wert 1 000 000 000, eine Eins mit neun Nullen. Man nennt dies die Exponentialdarstellung. Im Binärsystem lautet die Exponentialdarstellung beispielsweise: „1e101" (ist eine Abkürzung für 1 x 2^5). Das Zeichen „e" wird also immer gegen die Basis des jeweiligen Zahlensystems ausgetauscht (10 für Dezimalsystem, 2 für Binärsystem, 16 für Hexadezimalsystem). Die Zahl 100,0 entspricht 1,0 x 10^2 - eine Verschiebung des Kommas nach links entspricht einer Erhöhung des Exponenten. Die Zahl 0,001 entspricht 1,0 x 10^-3 - eine Verschiebung des Kommas nach rechts entspricht einer Verringerung des Exponenten.

 

IEEE Details

Fließkommazahlen werden in folgender Form dargestellt, wobei

[exponent] der binäre Exponent ist:

 

X = Fraction * 2^(exponent - bias)

 

[Fraction] ist der normalisierte Teil des Bruchteil der Zahl. Normalisiert, weil hier der Exponent derart angepasst wird, dass führende Zahl immer 1 ist. Da diese immer 1 ist, muss diese nicht gespeichert werden und man erlangt dadurch eine Stelle mehr für die Präzision. Da eine binäre Zahl nur aus 0 und 1 besteht, kann man den Exponenten so lange ändern, bis eine 1 vor dem Komma steht.

 

[bias] Der Vorgabewert (BIAS) wird verwendet, um zu vermeiden, dass negative Exponenten gespeichert werden müssen.

 

Der BIAS Wert für einfache Präzision (single precision numbers) ist 127 (dez) und 1023 (dez) für doppelte Genauigkeit (double-precision numbers)

 

Binäre Werte, bei denen alle Bit 0 oder 1 sind, sind speziellen Fällen vorbehalten. Es bestehen noch weitere spezielle Fälle, welche verschiedene Fehlerzustände darstellen.

 

 

Single-Precision Beispiele

2 = 1 * 2^1 = 0100 0000 0000 0000 ... 0000 0000 = 4000 0000 hex

Beachte, dass das Vorzeichenbit 0 ist und der Exponent 128, oder

 

100 0000 0 in Binärcode, welcher 127 + 1 ist. Die gespeicherte Mantisse ist (1.)

000 0000 ... 0000 0000, welche eine implizierte führende 1 hat. Die aktuelle Mantisse lautet also 1

 

 

-2 = -1 * 2^1 = 1100 0000 0000 0000 ... 0000 0000 = C000 0000 hex

Das Gleiche wie +2, außer das das Vorzeichenbit gesetzt wurde. Dies gilt für alle IEEE-Format Gleitkommazahlen.

 

4 = 1 * 2^2 = 0100 0000 1000 0000 ... 0000 0000 = 4080 0000 hex

Gleiche Mantisse, aber Exponent durch 1 erhöht (BIAS Wert ist 129 oder 100 0000 1 in Binärcode)

 

6 = 1.5 * 2^2 = 0100 0000 1100 0000 ... 0000 0000 = 40C0 0000 hex

Gleicher Exponent, die Mantisse ist um die Hälfe größer -- es ist Same exponent, mantissa is larger by half -- it's

 

(1.) 100 0000 ... 0000 0000, was, weil es sich um einen Binärbruch handelt, 1-1/2 (in Worten Ein und Einhalb)(die Werte eines Binärbruches sind 1/2, 1/4, 1/8, etc.).

 

1 = 1 * 2^0 = 0011 1111 1000 0000 ... 0000 0000 = 3F80 0000 hex

Der gleiche Exponent wie bei anderen Potenzen von 2, Mantisse ist eins weniger als 2 von 127 in Binärcode 011 1111 1

 

.75 = 1.5 * 2^-1 = 0011 1111 0100 0000 ... 0000 0000 = 3F40 0000 hex

 

Der vorgeladene ("biased") Exponent ist 126, im Binärcode 011 1111 0, und die Mantisse ist (1.) 100 0000 ... 0000 0000, was 1-1/2 entspricht.

 

 

2.5 = 1.25 * 2^1 = 0100 0000 0010 0000 ... 0000 0000 = 4020 0000 hex

Exakt das Gleiche wie 2, lediglich das BIT, welches 1/4 darstellt, ist in der Mantisse gesetzt.

 

 

0.1 = 1.6 * 2^-4 = 0011 1101 1100 1100 ... 1100 1101 = 3DCC CCCD hex

 

1/10 ist ein sich immer wiederholender Nachkommaanteil im binären System (periodischer Teilungsrest). Die Mantisse liegt nahe dem Wert von 1,6 und der Exponent besagt, dass 1,6 durch 16 geteilt werden soll (es ist 011 1101 1 in binären Darstellung, also 123 in Dezimalzahl). Der wahre Exponent ist 123 - 127 = -4 was bedeutet, dass der Faktor für die Multiplikation 2^-4 = 1/16 beträgt. Beachten Sie, dass die gespeicherte Mantisse in dem letzten Bit gerundet ist. Dies ist ein Versuch eine nicht darstellbare Zahl so genau wie möglich darzustellen. (Der Grund, dass 1/10 und 1/100 binärer nicht exakt dargestellt werden können ist ähnlich dem, dass 1/3 nicht exakt im dezimalen System dargestellt werden kann. Dies ergibt eben eine unendliche Periode von 3 --> 0,3333...)


 

 

0 = 1.0 * 2^-128 = Alles 0 -- ein spezieller Fall.

 

 

Other Common Floating-Point Errors

The following are common floating-point errors:

 

1. Round-off error

This error results when all of the bits in a binary number cannot be used in a calculation.

Example: Adding 0.0001 to 0.9900 (Single Precision)

Decimal 0.0001 will be represented as:

(1.)10100011011011100010111 * 2^(-14+Bias) (13 Leading 0s in Binary!)

 

 

0.9900 will be represented as:

(1.)11111010111000010100011 * 2^(-1+Bias)

 

Now to actually add these numbers, the decimal (binary) points must be aligned. For this they must be Unnormalized. Here is the resulting addition:

 

.000000000000011010001101 * 2^0 <- Only 11 of 23 Bits retained

+.111111010111000010100011 * 2^0

________________________________

.111111010111011100110000 * 2^0

 

 

This is called a round-off error because some computers round when shifting for addition. Others simply truncate. Round-off errors are important to consider whenever you are adding or multiplying two very different values.

 

 

2. Subtracting two almost equal values

 

.1235

-.1234

_____

.0001

 

This will be normalized. Note that although the original numbers each had four significant digits, the result has only one significant digit.

 

 

3. Overflow and underflow

This occurs when the result is too large or too small to be represented by the data type.

 

 

4. Quantizing error

This occurs with those numbers that cannot be represented in exact form by the floating-point standard.

 

 

 

Rounding

When a Long is assigned to a single, the number is rounded according to the rules of the IEEE committee.

 

For explanation: 1.500000 is exact the middle between 1.00000 and 2.000000. If x.500000 is always rounded up, than there is trend for higher values than the average of all numbers. So their rule says, half time to round up and half time to round down, if value behind LSB is exact ..500000000.

 

The rule is, round this .500000000000 to next even number, that means if LSB is 1 (half time) to round up, so the LSB is going to 0 (=even), if LSB is 0 (other half time) to round down, that means no rounding.

 

This rounding method is best since the absolute error is 0.

 

You can override the default IEEE rounding method by specifying the $LIB LONG2FLOAT.LBX library which rounds up to the next number. This is the method used up to 1.11.7.4 of the compiler.

 

 

 

Double

The double is essential the same as a single. Except the double consist of 8 bytes instead of 4. The exponent is 11 bits leaving 52 bits for the mantissa.

 

 

Arrays

An array is a set of sequentially indexed elements having the same type. Each element of an array has a unique index number that identifies it. Changes made to an element of an array do not affect the other elements.

 

The index must be a numeric constant, a byte, an integer, word or long.

The maximum number of elements is 65535. For Xmega with huge memory it is 8MB!

The first element of an array is always one by default. This means that elements are 1-based.

You can change this with CONFIG BASE=0. In this case, the first element will be element 0.

 

Arrays can be used on each place where a 'normal' variable is expected.

 

You can add an offset to the index too. This could be used to emulate a 2 dimensional array.

row_index = row  :  shift row_index, left,4

value = parameter_array(column+row_index)

 

 

 

Example

 

'create an array named a, with 10 elements (1 to 10)
Dim A(10) As Byte
'create an integer
Dim C As Integer
'now fill the array
For C = 1 To 10
'assign array element
A(c)= C
' print it
Print A(c)
Next
'you can add an offset to the index too
= 0
A(+ 1)= 100
Print A(+ 1)
End

 

 

Strings

A string is used to store text. A string must be dimensioned with the length specified.

 

DIM S as STRING * 5

 

Will create a string that can store a text with a maximum length of 5 bytes.

The space used is 6 bytes because a string is terminated with a null byte.

 

To assign the string:

Ds = "abcd"

 

To insert special characters into the string :

s= "AB{027}cd"

 

The {ascii} will insert the ASCII value into the string.

 

The number of digits must be 3.

s = "{27}" will assign "{27}" to the string instead of escape character 27!

 

Because the null byte (ASCII 0) is used to terminate a string, you can not embed a null byte into a string.

 

 

 

Casting

In BASCOM-AVR when you perform operations on variables they all must be of the same data type.

long = long1 * long2 ' for example

 

The assigned variables data type determines what kind of math is performed.

For example when you assign a long, long math will be used.

 

If you try to store the result of a LONG into a byte, only the LSB of the LONG will be stored into the BYTE.

Byte = LONG

 

When LONG = 256 , it will not fit into a BYTE. The result will be 256 AND 255 = 0.

 

Of course you are free to use different data types. The correct result is only guaranteed when you are using data types of the same kind or that result always can fit into the target data type.

 

 

When you use strings, the same rules apply. But there is one exception:

 

Dim b as Byte
 
= 123 ' ok this is normal
 
= "A" ' b = 65

 

When the target is a byte and the source variable is a string constant denoted by "", the ASCII value will be stored in the byte. This works also for tests :

 

IF b = "A" then ' when b = 65
 
END IF

 

This is different compared to QB/VB where you can not assign a string to a byte variable.

 

 

SINGLE CONVERSION

When you want to convert a SINGLE into a byte, word, integer or long the compiler will automatic convert the values when the source string is of the SINGLE data type.

 

integer = single

 

You can also convert a byte, word, integer or long into a SINGLE by assigning this variable to a SINGLE.

 

single = long



Languages   English Deutsch  
Personal tools
Namespaces
Variants
Actions
Navigation
In other languages
Language