integer durch "2" teilen?!

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
trip
Beiträge: 3
Registriert: Do 22. Mär 2012, 18:12

integer durch "2" teilen?!

Beitrag von trip »

Code: Alles auswählen

Program rofl;
 
var
  test, ergebnis : integer;
 
begin
     test := 40;
     ergebnis := test/2;
     writeln('Ergebnis: ', ergebnis);
end.
Warum kriege ich hier folgenden Compilerfehler?
Error: INcompatible types: got "Extended" expected "SmallInt"
Also hier gibt es wohl einen Typenkonflikt - das ist mir schon klar. Die 2 ist wohl "Extended" anstatt Integer...

Wie kann man denn eine Integer-"2" schreiben?! :mrgreen:

Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: integer durch "2" teilen?!

Beitrag von Eb »

Code: Alles auswählen

ergebnis := test DIV 2;

trip
Beiträge: 3
Registriert: Do 22. Mär 2012, 18:12

Re: integer durch "2" teilen?!

Beitrag von trip »

thx!

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: integer durch "2" teilen?!

Beitrag von MAC »

nein da liegt ein denkfehler dahinter...
Die 2 ist genauso integer wie die 40 auch. Aber beim Teiler kommt eine Gleitkommazahl raus. der Computer könnte ka auch 39 / 2 rechnen, da würde 19,5 rauskommen. Das ergebnis hat ein komma un ist deswegen Extendet. kann also nicht in einer integer variable gespeichert werden. also müsste entweder ergebnis vom typ "real" sein oder du schreibt

Code: Alles auswählen

ergebnis = round(test/2)
Der Tipp von Eb ist aber der beste weil es technisch sauber ist...
Ich wollte nur nochmal die logig dahinter erklären...

Code: Alles auswählen

Signatur := nil;

trip
Beiträge: 3
Registriert: Do 22. Mär 2012, 18:12

Re: integer durch "2" teilen?!

Beitrag von trip »

Dass es nicht an der Schreibweise der Zahl (hier "2") sondern dem mathematischen Operator "/" lag, hatte sich mir schon erschlossen. Danke.

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: integer durch "2" teilen?!

Beitrag von Euklid »

Wenn Du jetzt den "Rest" der Division wissen willst, kannst Du

Code: Alles auswählen

rest := test mod 2;
schreiben.

- Euklid

HOffen
Beiträge: 16
Registriert: Do 15. Mär 2012, 09:19
OS, Lazarus, FPC: Win7 (L 0.9.30.4RC3 FPC 2.6.0)
CPU-Target: 32Bit

Re: integer durch "2" teilen?!

Beitrag von HOffen »

Ganzzahlige Division durch Potenzen von 2 sind am effektivsten mit shr durchzuführen:

Code: Alles auswählen

// Beispiele
x div 2  = x shr 1
x div 4  = x shr 2
x div 8  = x shr 3
x div 16 = x shr 4
// usw.
Analog dazu funktioniert die Multiplikation mit Potenzen von 2 als Bit-Shift-Left (shl):

Code: Alles auswählen

// Beispiele
x * 2  = x shl 1
x * 4  = x shl 2
x * 8  = x shl 3
x * 16 = x shl 4
// usw.
"There are 10 kinds of human. Those who understand the binary system and those who don't."

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: integer durch "2" teilen?!

Beitrag von m.fuchs »

HOffen hat geschrieben:Ganzzahlige Division durch Potenzen von 2 sind am effektivsten mit shr durchzuführen:
Was bedeutet in diesem Fall "am effektivsten"?
Geschwindigkeitsvorteile? Bessere Lesbarkeit? Etwas anderes?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: integer durch "2" teilen?!

Beitrag von Socke »

m.fuchs hat geschrieben:Was bedeutet in diesem Fall "am effektivsten"?
Geschwindigkeitsvorteile? Bessere Lesbarkeit? Etwas anderes?
Der Prozessor muss hier nicht wirklich rechnen sondern lediglich die Bits nach Links oder Rechts verschieben. Das wirkt sich in der Regel aber nur bei sehr vielen Berechnungen aus. Und weil die Programmierer des Free Pascal Compilers das auch wissen, haben die das direkt eingebaut. (vgl. http://www.freepascal.org/docs-html/pro ... 200011.1.8)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: integer durch "2" teilen?!

Beitrag von m.fuchs »

Das hab ich mir schon fast gedacht, als mein Testprogramm keine zeitlichen Unterschiede zwischen div und shr feststellen konnte (bei ein paar Millionen Berechnungen jeweils). Und dann ist natürlich ganz klar div zu bevorzugen, wegen der besseren Lesbarkeit des Quelltextes.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: integer durch "2" teilen?!

Beitrag von mse »

Zur Illustration:

Code: Alles auswählen

var
 a,b: longword;
begin 
 a:= b div 2;
 a:= b shr 2;
end.
div_shr.png
Mit Vorzeichen:

Code: Alles auswählen

var
 a,b: integer;
begin 
 a:= b div 2;
 a:= b shr 2;
end.
div_shr_sig.png
Achtung, shr bringt für negative Zahlen nicht das gewünschte Resultat!

Martin

Antworten