Guten Morgen!
Dass eine untypisierte Gleitkomma-Konstante als Single verwendet wird, war mir bisher auch nicht bewusst.
Folgendes Web-Fundstück erklärt das Verhalten: "Normally, the compiler will set the precision of a floating point constant to the minimally required precision to represent it exactly".
Wenn das stimmt, unternimmt der Compiler also sogar extra eine Prüfung, ob er bei einem Ausdruck wie 1.0 Speicher sparen kann, weil für 1.0 keine hohe Präzision benötigt wird. Das Verhalten ist aber (erst dann) nachteilig, sobald damit gerechnet wird.
SizeOf(pi) => 8
SizeOf(1.0) => 4
SizeOf(1.0/180) => 4
SizeOf(1/180) => 8
Wie man am untersten Beispiel 1/180 sieht, wählt der Compiler für eine Berechnung durchaus vorzugsweise die Double-Precision, außer wenn durch eine Konstante, für die vermeintlich die Single-Präzision ausreicht, der Compiler dann auch die Berechnung in einfacher Präzision ansetzt.
Das ist gut zu wissen, denn somit sollte man Konstanten manuell typisieren: Double(1.0) ... wenn sie für Berechnungen genutzt werden sollen.
Zur Ehrenrettung von FreePascal muss man sagen, dass dieses Verhalten in Delphi auch so war (zumindest vor Version 2009).
Schon in früheren Delphi-Versionen gab es den Compiler-Schalter {$MINFPCONSTPREC 64} womit die Precision für untypisierte Gleitkomma-Konstanten auf 64 Bit (Double) hochgesetzt werden kann.
Dies wird auch im FreePascal-Wiki beschrieben, in der untersten Zeile:
https://wiki.freepascal.org/IEEE_754_formats
{$MINFPCONSTPREC 64}
SizeOf(1.0) => 8
SizeOf(1.0/180) => 8
Für Units mit Berechnungen könnte man sich angewöhnen, immer den Compiler-Schalter zu setzen, denn ich glaube heutzutage machen untypisierte Konstanten als Single keinen Sinn mehr.
Grüße, Jörg