Float to Integer Conversion

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Float to Integer Conversion

Beitrag von Theozh »

Hallo,
das scheint mir eine rechte Einsteigerfrage zu sein, aber ich finde keinen brauchbaren Hinweis...

Eine Funktion à la "FloatToInt()" finde ich nicht...

Timer1.Interval:= StrToInt(FloatToStr(StrToFloat(FInterval.Text)*1000));
kann's ja wohl nicht sein, oder etwa doch?

Wie bestimme ich dann ob es ein 1, 2, 4, 8 Byte Integer wird?

Danke für einen Link!

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2816
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: Float to Integer Conversion

Beitrag von m.fuchs »

Eine echte FloatToInt - Methode gibt es nicht. Eine verlustlose Konvertierung wäre ja auch nicht möglich.

Aber du hast zur Verfügung:
  • Round(für mathematisches Runden)
  • Trunc (schneidet einfach die Nachkommastellen ab)
  • Ceil (Unit Math, rundet immer auf)
  • Floor (Unit Math, rundet immer ab)
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Float to Integer Conversion

Beitrag von Soner »

Theozh hat geschrieben:Hallo,
Wie bestimme ich dann ob es ein 1, 2, 4, 8 Byte Integer wird?
Es wird genauso groß wie die Größe der Variable auf der linken Seite. Wenn du Bestimmen willst wieviel Byte deine Variable sein soll, dann must du passende Variablentyp nehmen.
Integer ist systemabhängig bei 32Bit System 32Bit groß (=4 Byte); bei 64Bit System 64Bit (=8Byte).
z.B:
b: byte;
i: integer;

i:=257;
b:=i; //b=1 weil unteren 8Bits(1Byte) benutzt werden.

Hier hast du Infos über die Zahlentypen und Größen:
http://www.freepascal.org/docs-html/ref/refsu5.html
http://www.freepascal.org/docs-html/ref ... 310003.1.2

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2816
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: Float to Integer Conversion

Beitrag von m.fuchs »

Soner hat geschrieben:

Code: Alles auswählen

b: byte;
i: integer;
 
i:=257;
b:=i;   //b=1 weil unteren 8Bits(1Byte) benutzt werden.
Dabei noch aufpassen, dass die Bereichsprüfung nicht angeschaltet wird (-Cr bzw. Projekt -> Projekteinstellungen -> Codegenerierung -> Bereich). Ansonsten gibt es einen Fehler.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Float to Integer Conversion

Beitrag von indianer-frank »

Soner hat geschrieben:Integer ist systemabhängig bei 32Bit System 32Bit groß (=4 Byte); bei 64Bit System 64Bit (=8Byte).
Das stimmt ganz und gar nicht. Die Größe ist im wesentlichen vom Compiler-Compatibilitymode via {$MODE} oder Kommadozeilenparameter -Sd, -S2 etc abhängig: Im Standard FPC Modus ist selbst für ein 64-Bit-Programm unter 64-Bit-OS ein integer 16 Bit groß, im Delphi- oder OBJFPC-Modus dann 32 Bit, und (soweit ich weiß) niemals 64 Bit!

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Float to Integer Conversion

Beitrag von Soner »

indianer-frank hat geschrieben:
Soner hat geschrieben:Integer ist systemabhängig bei 32Bit System 32Bit groß (=4 Byte); bei 64Bit System 64Bit (=8Byte).
Das stimmt ganz und gar nicht. Die Größe ist im wesentlichen vom Compiler-Compatibilitymode via {$MODE} oder Kommadozeilenparameter -Sd, -S2 etc abhängig: Im Standard FPC Modus ist selbst für ein 64-Bit-Programm unter 64-Bit-OS ein integer 16 Bit groß, im Delphi- oder OBJFPC-Modus dann 32 Bit, und (soweit ich weiß) niemals 64 Bit!
Ich hatte gelernt dass Integer-Größe bei Delphi/Pascal, C/C++(int) immer von irgendetwas abhängig ist. Entweder wird es per Default (nach Gusto von Compilerhersteller) oder meistens durch CPUMode gesetzt wird. Und wenn man feste Größen haben will soll man Typen verwenden die immer definierte Größe haben, die unabhängig von Prozessor und Bestriebssystem immer gleich groß sind.

In der fpc-Dokumentation was ich oben als Link angegeben habe steht:
...

Code: Alles auswählen

 
Type 	      Range  	                 Size in bytes
Smallint 	-32768 .. 32767            	2
Integer 	either smallint or longint 	size 2 or 4
Longint 	-2147483648 .. 2147483647            	4
 
The integer type maps to the smallint type in the default Free Pascal mode. It maps to either a longint in either Delphi or ObjFPC mode. The cardinal type is currently always mapped to the longword type.
..
Lazarus Programme werden immer in objfpc-Modus compiliert sofern man es nicht selber ändert. Es steht am Anfang von Units immer:
{$mode objfpc}
Vielleicht habe ich falsch verstanden.

ViNic
Beiträge: 7
Registriert: Di 14. Mai 2013, 09:10
OS, Lazarus, FPC: Windows 7 (L 1.0.10 FPC 2.6.2)
CPU-Target: 64Bit

Re: Float to Integer Conversion

Beitrag von ViNic »

Um zu schauen wie das der eigener Compiler regelt, kann man doch sizeof (Funktion?) benutzen.

Code: Alles auswählen

 
program Project1;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes,
  { you can add units after this }
  SysUtils;
 
begin
  writeln('Integer : ' + IntToStr(sizeof(integer)) + ' Byte. ');
  writeln('Real : ' + FloatToStr(sizeof(real)) + ' Byte. ');
  readln;
end.  
 
Mein Windows7 ist 64bit, Lazarus/FPC jedoch 32bit. Demnach nimmt ein integer bei mir 4 Byte ein.

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: Float to Integer Conversion

Beitrag von Achtzig »

ViNic hat geschrieben:Mein Windows7 ist 64bit, Lazarus/FPC jedoch 32bit. Demnach nimmt ein integer bei mir 4 Byte ein.
Das hört sich jetzt so an, als sein Integer nur 4 Byte weil Dein Lazarus mit 32 Bit arbeitet und es 8 Byte wären, wenn Lazarus 64 Bit hätte.

Dies ist aber nicht der Fall. Auf Debian64 mit Lazarus64 verbleibt ein Integer bei 4 Byte Länge. Ganz so wie es auch dokumentiert ist.

ViNic
Beiträge: 7
Registriert: Di 14. Mai 2013, 09:10
OS, Lazarus, FPC: Windows 7 (L 1.0.10 FPC 2.6.2)
CPU-Target: 64Bit

Re: Float to Integer Conversion

Beitrag von ViNic »

Stimmt. Ich habe es jetzt auch mit 64bit Lazarus und Linux64bit ausprobiert. Es sind 4 Byte.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Float to Integer Conversion

Beitrag von Komoluna »

gibt es auch etwas wie das hier:

Code: Alles auswählen

cutfloat(123.54328,3) //result = 123.543
cutfloat(14.28354,2) //result = 14.24
oder müsste man sich das selber basteln?

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: Float to Integer Conversion

Beitrag von Theozh »

das habe ich gefunden...

Code: Alles auswählen

 
FormatFloat('#.###',123.54328) // ergibt 123.543
 

Antworten