PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rätsel um eine Berechnung



RCO
20.01.2005, 17:13
Hallo leute,

kann mir einer erklären, warum folgende Rechnung als Ergebniss 18 liefert?


$baud = 19200
Const Konstante = 332400
Dim A As Word
Dim B As Word
A = 261
B = Konstante / A
Print B
End

Es hat was damit zu tun, dass A eine eine Variable ist, setze ich direkt 261 ein, klappt es.

Wie kriege ich das Problem gelöst?

Danke schonmal für alle Mühen im Voraus.

MFG Moritz

Manf
20.01.2005, 17:21
Sind die Rechenoperationen für Größen über 2 byte vorgesehen?

18 geht ja als Ergebnis von (332400 mod 2^16) / 216
Manfred

RCO
20.01.2005, 17:23
Erwischt... Keine Ahnung...
Aber wenn ich einfach:
B = 332400/261 rechne, klappt es!
Oder was meisntest du?

MFG Moritz

lorcan
20.01.2005, 17:25
Könnte es sein, dass Du mit Deinem Datentyp 'word' einen cast vornimmst, das heißt die Rechenoperation nur im 2 Byte-Bereich abläuft? Versuchs mal mit'nem 'long int' falls es so was in Basic gibt. Kenn mich nur mit C aus.

RCO
20.01.2005, 17:39
@ Manf:
Was genau meint mod?

@lorcan:
Ich glaube Basic (Bascom) verfügt nur über:
Bit
Byte
Word
Integer
Single

Und jetzt kommts, wenn ich B als Single declariere, dann klappts!
Das versteh mal einer:

Dim B as Word
B = 332400 / 261
klappt!

Dim B as Word
B = 332400 / A 'A = 261 (Word)
klappt nicht!

Dim B as Single
B = 332400 / A 'A = 261 (Word)
klappt!

Das verstehe ich echt nicht, wenn ich direkt Zahlen einsetzte ist es egal, wie groß die sind. Wenn A ein Word es klappt es dann nicht, außer wenn B ein Single ist.

Jetzt hab ich nen super Ergebniss:
1273.562110341

So genau wollte ich es nicht wissen, klaut mir auch eigenlich zuviel Speicher, dieses Single!

MFG Moritz

harryup
20.01.2005, 19:41
hi,
bascom kennt auch die long-typen (4byte), damit sollte es gehen und knabbert nicht so mörderisch am speicher ab.
grüssens, harry

RCO
20.01.2005, 19:48
Wunderbar! Damit klappts auch.
Also ich hatte schon öfter probleme mit den Variablengrößen:
Bit = Klar
nibble gibts nicht, oder?
byte = 8 Bit > 0 - 255
Word = 16 Bit > 0 -65535
Integer = 16 Bit > -32767 - 32767
longinteger gibts nicht, oder?
long = 32 Bit > 0 - 4.294.967.296 (auch bekannt als double word, oder?)
single = ? > ?

Danke nochmal! Aber verstehen tue ich es immer noch nicht.

MFG Moritz

Manf
20.01.2005, 20:16
@ Manf: Was genau meint mod?
Die Schreibweise ist vielleicht auch schon ein Opfer der Rechtschreibreform. O:)
Die mathematische, nicht programmtechnische Schreibweise von Modulo.
http://de.wikipedia.org/wiki/Kongruenz_(Zahlentheorie)
Manfred

RCO
20.01.2005, 20:31
Die Schreibweise ist vielleicht auch schon ein Opfer der Rechtschreibreform.

Was soll das nun wieder heißen? ;-)

Mod war mir aus Delphi bekannt, na eher wieder unbekannt. Aber warum sollte Bascom so einen Aufwand machen? ODer willst du damit sagen, dass damit nur die oberen Bits über 2^16 wegfallen und der Rest durch 216 geteilt wird?

O:) Ja das wolltest du sagen, hab grade mal nachgerechnet.
Gibt dann in soweit auch Sinn!

Ich verstehe nur nicht, warum dann

B[Word] = 332400/261

funktioniert.

harryup
20.01.2005, 20:38
hi,
bin ich auch schon öfters drübergestolpert und komm zu dem schluss, dass bei jeder rechenoperation mit variablen der zieltyp so gross sein muss, dass er jeden operanten aufnehmen könnte.
vielleicht machts bascom ja so:
kopiere KONSTANTE in VARIABLE_B und teile dann B durch A, dann wäre zumindest nachvollziehbar warum dem so ist.
grüssens, harry

RCO
20.01.2005, 20:46
Jein, da es ja nicht immer so ist:

B = Konstante / 261

Const C = 261
B = Konstante / C

Wenn es so wäre wie du meinst, was durchaus sinn geben würde, würde es ja eine gewisse logik aufweisen, aber warum geht das oben geschriebene. Das Lustige ist, dass es bei einer Konstanten funktioniert!
Wenn man allerdings die Konstante an eine Sub übergibt, funktioniert es nicht, das hatte ich eigentlich vor:

Call Unterfunktion(C)
Sub Unterfunktion(byval V as word)
Hier die rechung

Geht aber nicht, da der Zahlenwert aus der konstanten C wieder eine Variable (V) wird und dann die Rechnung durchgeführt. wird. Es scheint also ein Unterschied zu geben, ob der Nenner einer Division eine Konstante (also auch eine dort stehende Tahl) oder der Wert einer Variablen ist.

MFG Moritz