Aktuelle Zeit: 25 Feb 2018 02:59:19


Aufgepasst beim Rechnen

Everything else, pointless stuff, jokes and news from the world.
Alles Sonstige, sinnloses Zeug, Späße und Neues aus der Welt.
  • Autor
  • Nachricht
Offline

dj4jz

  • Beiträge: 51
  • Registriert: 21 Jan 2013 19:02:38

Aufgepasst beim Rechnen

Beitrag15 Jan 2018 15:53:00

Hier eine interessante Aufgabe:
Code: Alles auswählen
const F_CPU   = 20000000
const versions_nr = 8
'const F_CPU   = 8000000
'avr.device   = atmega32
'avr.device   = atmega644p
avr.device   = atmega1284p
avr.clock   = F_CPU
avr.stack   = 512
uart.baud = 4800
uart.recv.enable
uart.send.enable
Avr.Interrupts.Enable

Const wert0 = 8000000
Dim wert1 As Integer = 650
Dim wert2 As Integer = -1450
dim wert3 as integer = 0
dim wert4 as integer = 1


wert0_wert2 = wert0+wert2+1
print "wert0+wert2+1 "; format("-0.000.000",wert0_wert2)

wert0_wert2 = wert0+wert2+1
print "wert0+wert2+1 "; format("-0.000.000",wert0_wert2)

wert0_wert2 = wert0+wert2+1
print "wert0+wert2+1 "; format("-0.000.000",wert0_wert2)


print "Wert0 "; format("0.000.000",wert0)
print "Wert1 "; format("-0.000",wert1)
print "Wert2 "; format("-00.000",wert2)

Dim wert0_wert2_wert1 as long
Dim wert0_wert2 as long

wert0_wert2_wert1 = wert0+wert2+wert1
print "wert0+wert2+wert1 "; format("-0.000.000",wert0_wert2_wert1)

wert0_wert2 = wert0+wert2
print "wert0+wert2 "; format("-0.000.000",wert0_wert2)

wert0_wert2 = wert0+wert2+0
print "wert0+wert2+0 "; format("-0.000.000",wert0_wert2)

wert0_wert2 = wert0+wert2+1
print "wert0+wert2+1 "; format("-0.000.000",wert0_wert2)

wert0_wert2 = wert0+wert2+2
print "wert0+wert2+2 "; format("-0.000.000",wert0_wert2)

wert0_wert2 = wert0+wert2+wert3
print "wert0+wert2+wert3 "; format("-0.000.000",wert0_wert2)

wert0_wert2 = wert0+wert2+wert4
print "wert0+wert2+wert4 "; format("-0.000.000",wert0_wert2)

do
loop

Das ist das Ergebnis.
wert0+wert2+1 7.998.551
wert0+wert2+1 7.998.551
wert0+wert2+1 7.998.551
Wert0 8.000.000
Wert1 0.650
Wert2 -01.450
wert0+wert2+wert1 7.999.200
wert0+wert2 8.064.086
wert0+wert2+0 8.064.086

wert0+wert2+1 7.998.551
wert0+wert2+2 7.998.552
wert0+wert2+wert3 7.998.550
wert0+wert2+wert4 7.998.551

Hierbei ist das Ergebnis wert0+wert2 interessant. Im Moment erschließt sich mir nicht woher das kommt.
Gruß Jürgen
Offline

de0508

  • Beiträge: 2111
  • Registriert: 02 Okt 2012 18:18:30
  • Wohnort: Hessen, Deutschland

Re: Aufgepasst beim Rechnen

Beitrag15 Jan 2018 17:28:06

Hallo Jürgen,

castest Du die Varibale wert2 wie folgt, dann stimmt die Rechnung.
Siehe auch die Konstante wert0.
Code: Alles auswählen
'---------------------------------------
' System Settings
'---------------------------------------
const F_CPU = 14745600
avr.device = atmega32
avr.clock = avr.F_CPU
avr.stack = 42

uart.baud = 19200
uart.txd.fifo = 16
uart.txd.enable

avr.Interrupts.Enable

const wert0 = long(8000000)

dim wert1 As integer = 650
dim wert2 As integer = -1450
dim wert3 as integer = 0

dim wert0_wert2 as long

'---------------------------------------
print "-----------------------"

'---------------------------------------
#if 1
print "Wert0 "; str(wert0)
print "Wert1 "; str(wert1)
print "Wert2 "; str(wert2)
#endif

'---------------------------------------
wert0_wert2 = wert0+longint(wert2) ' 7.998.550
print "wert0+wert2 "; format("-0.000.000",wert0_wert2)
print "soll:        7.998.550"

'---------------------------------------
wert0_wert2 = wert0+longint(wert2)+0 ' 7.998.550
print "wert0+wert2+0 "; format("-0.000.000",wert0_wert2)
print "soll:          7.998.550"

do
loop


Die Variable wert2 = -1450 wurde in deinem Beispiel nicht als 32 Bit signed Integer behandelt sondern als 16 Bit signed Integer.
Code: Alles auswählen
-1450 = 0xfa56 (16bit)
-1450 = 0xfffffa56 (32bit)

Gerechnet wurde aber trotzdem mit 32 Bit.
Also -1450 = 0xfa56 (16bit) falsch erweitert auf 32 Bit: 64086 = 0x0000fa56 (32bit).
Dies ist nun aber eine positive 32 Bit Zahl!
Code: Alles auswählen
 alles (32bit) Zahlen
 0x007a1200 == 8000000
+0x0000fa56 ==   64086
---------------------------------
 0x007b0c56 == 8064086
Grüße Uwe
Offline

dj4jz

  • Beiträge: 51
  • Registriert: 21 Jan 2013 19:02:38

Re: Aufgepasst beim Rechnen

Beitrag16 Jan 2018 19:27:12

Ok Uwe,
danke für die Erklärung. Aber was passiert wenn ich den Wert1 dazu rechne, da ist das Ergebnis richtig.
Ist das ein Bug im Compiler oder muss ich zukünftig darauf achten?
Gruß Jürgen
Offline

de0508

  • Beiträge: 2111
  • Registriert: 02 Okt 2012 18:18:30
  • Wohnort: Hessen, Deutschland

Re: Aufgepasst beim Rechnen

Beitrag17 Jan 2018 08:41:22

Hallo Jürgen,

ich habe deinen Thread in einen anderen Bereich verschoben, so kann sich Richard einfacher einklinken.
Grüße Uwe

Zurück zu Mental Home / Heilanstalt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron