mikrocontroller.net

Forum: Compiler & IDEs float <=> double


Autor: adds (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: adds (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: adds (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, danke für die Details!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.



Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.