Warum gibt es float?
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Warum gibt es float?
Ich bin verwirrt? Habe unüberlegt und weils halt ging in einigen Units Variablen als "float" deklariert.
Und jetzt festgestellt: Das geht nur, wenn ich die Unit "math" einbinde.
Aber warum gibt es ein "float" in der math-Unit, wenn es doch "real" genausogut tun würde, falls ich den Datentyp nicht auf single oder double festlegen will?
Aufgefallen ist es halt, weil ich die math-Unit aus dem Projekt genommen habe, da die Funktionen nicht benötigt wurden. Die Variablen aber noch so definiert waren.
Und jetzt festgestellt: Das geht nur, wenn ich die Unit "math" einbinde.
Aber warum gibt es ein "float" in der math-Unit, wenn es doch "real" genausogut tun würde, falls ich den Datentyp nicht auf single oder double festlegen will?
Aufgefallen ist es halt, weil ich die math-Unit aus dem Projekt genommen habe, da die Funktionen nicht benötigt wurden. Die Variablen aber noch so definiert waren.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Warum gibt es float?
Hi!
Real war doch dieser Turbo Pascal Zwitter zwischen single und double mit 48 Bit - wenn ich mich recht erinnere.
Keine Ahnung wie der heute behandelt wird, wenn der im Source auftaucht.
Aber gerade im Zahlenraum gibt's doch mehrere Doppelbezeichnungen:
Cardinal und DWord,
LongInt und Integer (heutzutage),
Ist halt ein Syntax-Gemisch gewachsen:
Cardinal kommt von Modula II
Float kommt von C
Solange Du weisst, welchen Zahlenbereich Dein Type abdeckt, ist doch alles ok.
Winni
Real war doch dieser Turbo Pascal Zwitter zwischen single und double mit 48 Bit - wenn ich mich recht erinnere.
Keine Ahnung wie der heute behandelt wird, wenn der im Source auftaucht.
Aber gerade im Zahlenraum gibt's doch mehrere Doppelbezeichnungen:
Cardinal und DWord,
LongInt und Integer (heutzutage),
Ist halt ein Syntax-Gemisch gewachsen:
Cardinal kommt von Modula II
Float kommt von C
Solange Du weisst, welchen Zahlenbereich Dein Type abdeckt, ist doch alles ok.
Winni
Re: Warum gibt es float?
Der Grund steht eig. hier unter Description:
https://www.freepascal.org/docs-html/3. ... float.html
https://www.freepascal.org/docs-html/3. ... float.html
-
- Lazarusforum e. V.
- Beiträge: 3158
- 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: Warum gibt es float?
Float nutzt immer den größt möglichen Fließkommadatentypen, der verfügbar ist:Timm Thaler hat geschrieben: ↑Fr 28. Aug 2020, 11:04Aber warum gibt es ein "float" in der math-Unit, wenn es doch "real" genausogut tun würde, falls ich den Datentyp nicht auf single oder double festlegen will?
- Float128
- Extended
- double
- Single
Einen Unterschied hast du zwischen Math.Float und Extended also nur, auf x86 Prozessoren, die auch Float128 unterstützten.FPC Programmer guide hat geschrieben: For all other processors which support floating point operations, the extended type is a nickname for the type which supports the most precision, this is usually the double type. On processors which do not support co-processor operations (and which have the {$E+} switch), the extended type usually maps to the single type.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Warum gibt es float?
Naja, wenn ich das richtig sehe wird in der math-Unit auch nur extended auf float getyped.
Und dann ist float natürlich Falsch, wenn man ein real will.
Und dann ist float natürlich Falsch, wenn man ein real will.
Es gibt extra noch real48.
-
- Beiträge: 6194
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Warum gibt es float?
Eines der wenigen Sachen, die ich in C und Java besser als in Pascal finde, ist die Bezeichnung float und double. Ist übrigens auch in OpenGL so.
Bei Ganzzahlen verwende ich immer die int16, int32, uint16, etc., wen mir der Datentyp sehr wichtig ist. ZB. bei der AVR-Programmierung.
Bei Ganzzahlen verwende ich immer die int16, int32, uint16, etc., wen mir der Datentyp sehr wichtig ist. ZB. bei der AVR-Programmierung.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Warum gibt es float?
Hmpf!
https://www.freepascal.org/docs-html/rt ... float.html
Source position: math.pp line 113
type Float = extended;
https://www.freepascal.org/docs-html/3. ... float.html
Source position: math.pp line 64
type Float = MaxFloatType;
-
- Beiträge: 1909
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Warum gibt es float?
Tatsächlich mag ich pascal mehr, weil die namen den technischen konstrukten entsprechen. Ein single is eine single-precision-floatingpoint-number und ein double ist eine double-precision-floatingpoint-number. Diese bezeichnungen werden so im IEEE 754 standard sogar verwendet. Was der kram mit Real soll versteh ich auch nicht so ganz, ein Real müsste mMn eine arbitrary length floatingpoint number sein (rein vom namen), der name Extended is glaub ich so ne intel erfindung gewesen. Float128 müsste nach dieser nomenklatur dann aber quadruple heißen.Mathias hat geschrieben: ↑Fr 28. Aug 2020, 15:39Eines der wenigen Sachen, die ich in C und Java besser als in Pascal finde, ist die Bezeichnung float und double. Ist übrigens auch in OpenGL so.
Bei Ganzzahlen verwende ich immer die int16, int32, uint16, etc., wen mir der Datentyp sehr wichtig ist. ZB. bei der AVR-Programmierung.
Und für unsigned zahlen, diese werden technisch (und auch in der theorie) sehr gerne als bitworte bezeichnet, die ausdrücke word für 16 bit Bitworte, d(double)word für 32 bit Bitworte un q(adruple)word für 64 bit Bitworte macht also aus der hinsicht auch sinn.
Was mich komplett verwirrt sind hingegen Shortint, smallint und longint, sowie longword. Ich mein das einzige was ich aus diesen Namen ableiten kann ist das long wahrscheinlich größer als snmall und short ist, aber was ist kleiner, was was short ist oder was was small ist.
Und am schlimmsten ist Cardinal, der name referenziert die Kardinalzahlen, also rein vom namen würden man denken das das ein typ für Zähl variablen ist (also die anzahl an dingen in einer menge beschreibt). Gibt also mMn. 2 typen die vom namen her sinn machen würden, 1. SizeUInt, da du damit alles zählen kannst was sich theretisch im memory aufhalten kann, oder arbitrary precision unsigned integer, da du damit N0 abbildest (was in der Mathematik für gewöhnlich die definiton der Kardinalzahlen sind). Aber nein, Cardinals sind 32 bit Bitworte, weil, wer hätte denken können das es jemals mehr als 32 bit Rechner geben würde
Re: Warum gibt es float?
a: Documentation generated on: Jun 22 2020Timm Thaler hat geschrieben: ↑Fr 28. Aug 2020, 16:29Hmpf!
https://www.freepascal.org/docs-html/rt ... float.html
Source position: math.pp line 113
type Float = extended;
https://www.freepascal.org/docs-html/3. ... float.html
Source position: math.pp line 64
type Float = MaxFloatType;
b: Documentation generated on: Mar 17 2017
Aber ja, ich versteh's auch nicht.
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Warum gibt es float?
Was mich wirklich daran stört: Wenn man danach sucht, zeigt Google nur eines der Ergebnisse, das andere wegen Ähnlichkeit nicht. Und man muss jedesmal drauf achten, auch die neueste Version zu haben und nicht eine veraltete Doku.
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Warum gibt es float?
Ja, und das ist auch sinnvoll. Es wird die Bitbreite des Zielsystems verwendet. Extrem hilfreich, wenn man Programme für 32 und 64bit PC und für 32bit ARM (Raspberry) kompiliert.
Erzwingt man hier mit single und double eine Bitbreite, dann muss der Compiler ständig anpassen. Denn ein 64-Bit-System rechnet natürlich trotzdem mit 64 Bit, auch wenn Single angegeben ist.
Das Gleiche bei Ganzzahlen, hier ist Integer die beste Wahl, auch wenn es in ein Byte passen würde. Denn auf einem 64-Bit-System wird ein Byte eh als 64-Bit durchgezogen. Damit bin ich schon ordentlich auf die Fresse geflogen: Die Routine lief mit der Variable als Byte auf dem PC wunderbar - portiert auf den Mikrocontroller gab es falsche Werte. Tja, auf dem PC war das Byte 64 Bit, auf dem AVR nur 8 Bit und ist übergelaufen.
Auf dem AVR Mikrocontroller dagegen verwende ich konsequent int16, uint8... Da will ich selbst festlegen, wie groß meine Variablen sind und wieviel Speicher sie belegen.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Warum gibt es float?
Hi!
Kann man doch alles selbst bauen:
Winni
Kann man doch alles selbst bauen:
Code: Alles auswählen
TYPE
TMyFloat = {$IFDEF CPU64} Double {$ELSE} Single{$ENDIF};
-
- Beiträge: 6194
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Warum gibt es float?
In einem Byte Array, kann man mit packed 8bit pro Byte erzwingen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Warum gibt es float?
Hi!
Das ist zwar nett gemeint von Matthias, aber nicht notwendig.
Nicht rumjammern über 64-Bit-Bytes, sondern einfach das Range-Checking einschalten:
{$R+}
Dafür ist es gedacht!
Löst dann ne exception oder zumindest runtime error 201 aus.
Wir sind doch hier nicht in einem C-Kurs, wo erstmal bedenkenlos, hirnlos und sinnlos alles checking abgestellt wird. Damit man auch auf das element[80] in einem achtziger-array zugreifen kann ....
Winni
Das ist zwar nett gemeint von Matthias, aber nicht notwendig.
Nicht rumjammern über 64-Bit-Bytes, sondern einfach das Range-Checking einschalten:
{$R+}
Dafür ist es gedacht!
Löst dann ne exception oder zumindest runtime error 201 aus.
Wir sind doch hier nicht in einem C-Kurs, wo erstmal bedenkenlos, hirnlos und sinnlos alles checking abgestellt wird. Damit man auch auf das element[80] in einem achtziger-array zugreifen kann ....
Winni
-
- Beiträge: 830
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Warum gibt es float?
Der Typ Float stammt wahrscheinlich aus einer Zeit, bei der bei FPC noch nicht klar war, ob Extended auf Double gemappt wird, oder einfach nicht existiert, wenn 80-bit Fließkommazahlen nicht verfügbar sind. In dem Fall hätte es einen klaren Unterschied gegeben (vom Typ Float128 mal abgesehen).
Der Typ Real existiert zur Kompatibilität mit Turbo Pascal, wobei hier nur das Kompilieren erlaubt werden soll, er ist kein tatsächlicher 48-Bit Typ, wie er in TP war.
Für letzteres existiert dann der separate Typ Real48, der vorwiegend für die (De)Serialisierung von alten TP Dateien (file of real, etc.) gedacht ist. Diese Zweiteilung existiert auf Grund von Delphi Kompatibilität, da dort Real auch nur ein Double ist.
Der Typ Real existiert zur Kompatibilität mit Turbo Pascal, wobei hier nur das Kompilieren erlaubt werden soll, er ist kein tatsächlicher 48-Bit Typ, wie er in TP war.
Für letzteres existiert dann der separate Typ Real48, der vorwiegend für die (De)Serialisierung von alten TP Dateien (file of real, etc.) gedacht ist. Diese Zweiteilung existiert auf Grund von Delphi Kompatibilität, da dort Real auch nur ein Double ist.
Hmm, da ist wohl was mit der Generierung der Dokumentation schief gelaufen, da eigentlich die Deklaration type Float = MaxFloatType für FpDoc aktiv sein sollte...Timm Thaler hat geschrieben: ↑Fr 28. Aug 2020, 16:29Hmpf!
https://www.freepascal.org/docs-html/rt ... float.html
Source position: math.pp line 113
type Float = extended;
https://www.freepascal.org/docs-html/3. ... float.html
Source position: math.pp line 64
type Float = MaxFloatType;
FPC Compiler Entwickler