Warum gibt es float?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Timm Thaler
Beiträge: 1088
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?

Beitrag von Timm Thaler »

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.

Winni
Beiträge: 353
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Warum gibt es float?

Beitrag von Winni »

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

Benutzeravatar
theo
Beiträge: 8406
Registriert: Mo 11. Sep 2006, 19:01

Re: Warum gibt es float?

Beitrag von theo »

Der Grund steht eig. hier unter Description:
https://www.freepascal.org/docs-html/3. ... float.html

Socke
Lazarusforum e. V.
Beiträge: 2779
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?

Beitrag von Socke »

Timm Thaler hat geschrieben:
Fr 28. Aug 2020, 11:04
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?
Float nutzt immer den größt möglichen Fließkommadatentypen, der verfügbar ist:
  • Float128
  • Extended
  • double
  • Single
Wobei dieses Verhalten eigentlich auch schon für Extended beschrieben ist:
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.
Einen Unterschied hast du zwischen Math.Float und Extended also nur, auf x86 Prozessoren, die auch Float128 unterstützten.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Timm Thaler
Beiträge: 1088
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?

Beitrag von Timm Thaler »

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.
Winni hat geschrieben:
Fr 28. Aug 2020, 12:26
Real war doch dieser Turbo Pascal Zwitter zwischen single und double mit 48 Bit - wenn ich mich recht erinnere.
Es gibt extra noch real48.

Mathias
Beiträge: 5038
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Warum gibt es float?

Beitrag von Mathias »

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.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1088
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?

Beitrag von Timm Thaler »

theo hat geschrieben:
Fr 28. Aug 2020, 12:50
Der Grund steht eig. hier unter Description:
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;

Warf
Beiträge: 1479
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Warum gibt es float?

Beitrag von Warf »

Mathias hat geschrieben:
Fr 28. Aug 2020, 15:39
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.
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.

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

Benutzeravatar
theo
Beiträge: 8406
Registriert: Mo 11. Sep 2006, 19:01

Re: Warum gibt es float?

Beitrag von theo »

Timm Thaler hat geschrieben:
Fr 28. Aug 2020, 16:29
theo hat geschrieben:
Fr 28. Aug 2020, 12:50
Der Grund steht eig. hier unter Description:
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;
a: Documentation generated on: Jun 22 2020
b: Documentation generated on: Mar 17 2017

Aber ja, ich versteh's auch nicht.

Timm Thaler
Beiträge: 1088
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?

Beitrag von Timm Thaler »

theo hat geschrieben:
Fr 28. Aug 2020, 17:23
a: Documentation generated on: Jun 22 2020
b: Documentation generated on: Mar 17 2017
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.

Timm Thaler
Beiträge: 1088
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?

Beitrag von Timm Thaler »

Warf hat geschrieben:
Fr 28. Aug 2020, 16:39
Was der kram mit Real soll versteh ich auch nicht so ganz, ein Real müsste mMn eine arbitrary length floatingpoint number sein
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: 353
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Warum gibt es float?

Beitrag von Winni »

Hi!

Kann man doch alles selbst bauen:

Code: Alles auswählen

TYPE
TMyFloat = {$IFDEF CPU64} Double {$ELSE}  Single{$ENDIF};
Winni

Mathias
Beiträge: 5038
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Warum gibt es float?

Beitrag von Mathias »

In einem Byte Array, kann man mit packed 8bit pro Byte erzwingen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Winni
Beiträge: 353
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Warum gibt es float?

Beitrag von Winni »

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

PascalDragon
Beiträge: 53
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?

Beitrag von PascalDragon »

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.
Timm Thaler hat geschrieben:
Fr 28. Aug 2020, 16:29
theo hat geschrieben:
Fr 28. Aug 2020, 12:50
Der Grund steht eig. hier unter Description:
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;
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... 🤔
FPC Compiler Entwickler

Antworten