Forum: Compiler & IDEs float <=> double


von adds (Gast)


Lesenswert?

Ich erhalte die Meldung:

format "%.1f" expects type double, but argument 3 has type float

im Befehl

sprintf(strValue, "%.1f", f);


Warum geht die Typkonvertierung nur mit double? Double braucht ja 
doppelt so viel Speicherplatz wie float :-(

von johnny.m (Gast)


Lesenswert?

Im AVR-GCC sind double und float afaik bis auf den Namen gleich. AVR-GCC 
unterstützt keinen 64-Bit-Fließkommatyp. Sollte deshalb keine Probleme 
geben.

von Karl heinz B. (kbucheg)


Lesenswert?

Das Formatierkennzeichen für float ist %f, nicht %lf
(Übrigens ist auch das Formatierkennzeichen für double %f
bei printf(). %lf ist eigentlich eine Erweiterung, die
gar nicht notwendig wäre).

von adds (Gast)


Lesenswert?

Es ist nicht "LF" gemeint sondern ".EinsF", sprich auf 1 Nachkommastelle 
gerundet.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Leicht OT, aber hier wohl passend:
Ich empfehle die Verwendung eines eindeutig lesbaren Fonts für die 
Fixed-Pitch-Darstellung. Courier bzw. Courier New ist diesbezüglich 
ungeeignet, Andale Mono oder Consolas sind hier ganz eindeutig im 
Vorteil, weil bei ihnen 0O 1Il bei allen Schriftgrößen sehr deutlich 
unterscheidbar sind.

von Karl heinz B. (kbucheg)


Lesenswert?

> Es ist nicht "LF" gemeint sondern ".EinsF", sprich auf 1 Nachkommastelle
> gerundet.

Ah. Sorry.
Ist mit dem hier verwendetem Font nicht unterscheidbar.
Da sollten wir mal mit Andi drüber reden.

> Warum geht die Typkonvertierung nur mit double? Double braucht ja
> doppelt so viel Speicherplatz wie float :-(

Jetzt ist alles klar.
Die Antwort ist:
Weil printf() eine variadische Funktion ist.
D.h. es gibt keinen Prototypen, der dem Compiler sagen
würde, wie die Datentypen (mit Ausnahme des ersten
Argumentes, dem Formatstring) aussehen. Daher gelten
hier Standardregeln. Und eine dieser Standardregeln besagt,
dass ein float immer als double übergeben wird. printf()
kriegt also niemals einen float zu Gesicht, immer nur
double. printf kriegt übrigens auch niemals einen char
zu Gesicht, weil eben besagte Regeln festlegen, dass ein
char implizit zu einem int hochgecastet ('promoted')
wird. Daher ist zb auch
    printf( "%c", 23 );
kein Problem. 23 ist ein int, und %c holt sich einen int
aus der Argumentliste. Wenn allerdings diese Promotingregel
nicht wäre, dann hätte man hier:
    printf( "%c", 'a' );
dann effektiv ein Problem. %c holt sich einen int, als Argument
wäre aber nur ein char da. Durch die Promotingregel, dass ein
char als int übergeben wird, bügelt sich das alles wieder aus.

von adds (Gast)


Lesenswert?

OK, danke für die Details!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Ah. Sorry.
> Ist mit dem hier verwendetem Font nicht unterscheidbar.
> Da sollten wir mal mit Andi drüber reden.

Das ist nicht Andreas' Aufgabe, das kannst Du bei Deinem Browser leicht 
selbst einstellen.

FF: Extras->Einstellungen->[Inhalt] aufrufen
dort den "Erweitert"-Knopf für Schriftarteinstellungen anklicken und im 
nun erscheinenden Dialog eine andere Schriftart für "Feste Breite" 
einstellen.

Da das für jede einzelne Zeichencodierung einzeln durchzuführen ist, 
lässt sich das auch mit about:config unter

font.name.monospace.x-western
font.name.monospace.x-user-def
font.name.monospace.x-unicode

etc. eintragen.

IE: Extras->Internetoptionen->[Allgemein] aufrufen, dort den Knopf 
"Schriftarten" anklicken und in der rechten Liste auswählen.



Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.