double belegt weniger Speicher als float?

OP #2337778
Lesenswert?

Hi Leute!

Ich brauch mal euren Expertenrat - ich habe hier ein paar Routinen 
geschrieben, welche ich in einer .h per Definition komplett als float 
oder als double kompilieren lassen kann.

Grund ist, je nach geforderter Genauigkeit umzustellen, um die 
Geschichte zu beschleunigen und Code zu sparen.

Dachte ich, aber da lieg ich offenbar falsch.


Wenn ich alles als double berechne, dann sieht der Speicher 
folgendermaßen aus:

12926 Code
  539 Data
   64 Const

Als float:

14466 Code
  427 Data
   64 Const

Compiler ist IAR und der Controller ist ein MSP430.

Also dass bei double die Größe der Daten ansteigt leuchtet mir ja ein, 
aber wieso wird der Code bei float größer?


Kann mir da einer was zu sagen?


---------------------------------

Nachtrag: Eine bestimmte Berechnung dauert im double 77044 Cycles
                                           im float  71957 Cycles

Schneller ist float also, wenn auch nur geringfügig...
#2337786
Lesenswert?

Nach C-Standard werden alle Gleitkommaoperationen in double ausgeführt, 
also auch wenn du float*float rechnest.
Das kostet logischerweise mehr Code als gleich alles in double zu 
halten.

Ich vermute, daß es daran liegt (kenne dein System nicht).

float spart nur Speicher; besonders bei großen Feldern natürlich.
#2337882
Lesenswert?

LuXXuS 909 schrieb:
> Klaus Wachtler schrieb:
>> kenne dein System nicht
>
> Was musste wissen?

Bei avr-gcc ist es beispielsweise so, daß es gar keinen eigenenen 
double-Typ gibt, bzw. sind float und double dort identisch.
Dann gilt meine obige Aussage natürlich nicht.
Ob das bei dir auch so ist, müsstest du bei deinen Unterlagen finden 
(oder einfach sizeof(double) und sizeof(float) ausgeben und 
vergleichen).
Gast #2337908
Lesenswert?

> Nach C-Standard werden alle Gleitkommaoperationen in double ausgeführt

In der Praxis ist es um einiges verwickelter.

Zumindest der GCC betreibt einigen Aufwand um so weit wie möglich bei 
float zu bleiben. Gibt dann sogar 2 Sätze Funktionen (sin, cos...) in 
der Library.

Hast du schon kontrolliert, ob in deiner float-Variante die Libraries 
doppelt eingebunden wurden? Z.B. "sin" und "sinf".
#2337933
Lesenswert?

A. K. schrieb:
> Klaus Wachtler schrieb:
>
>> Nach C-Standard werden alle Gleitkommaoperationen in double ausgeführt,
>> also auch wenn du float*float rechnest.
>
> Nixda. Das war zwar zu Grossvaters Zeiten (anno K&R) mal so definiert,
> gilt aber schon seit ANSI C nicht mehr.

ANSI C hat aber bei float_variable*float_konstante noch in double 
gerechnet... Und sowas gibt es bestimmt auch heute noch. ;)

Volker
Gast #2337955
Lesenswert?

> Und sowas gibt es bestimmt auch heute noch.

Vorstellbar wäre z.B.

a = log(2.0 * b)
statt
a = log(2,0f * b)

und schon weiß der Optimizer nicht mehr, dass eine Float-Konstante 
ausreichen würde.
Gast #2337974
Lesenswert?

> sondern eine Funktion mit definiertem Parameter

Theoretisch ja,

aber zumindest die GCC Entwickler sehen das recht pragmatisch. Gibt 
einige üble Makros in der bits/mathcalls.h und 2 Funktionen in der 
Library.
#2337983
Lesenswert?

Egal Anders schrieb:

> aber zumindest die GCC Entwickler sehen das recht pragmatisch. Gibt
> einige üble Makros in der bits/mathcalls.h und 2 Funktionen in der
> Library.

Yep, aber zwei verschiedene. log() für double und logf() für float. In C 
geht das nicht anders. Wobei vor ANSI C ein logf() unsinnig gewesen 
wäre, weil per Sprachdefinition Parameter (vmtl. auch Returnwert) 
zwingend double waren, nicht float sein konnten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren