mikrocontroller.net

Forum: PC-Programmierung Case-Funktion , C-programmierung


Autor: Tommy Letz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich muss wissen, was genau der unterschied ist , wenn ich eine double
in eine float umwandle oder es nicht mache.
werden dann bei der double einfach stellen gestrichen oder wird
gerundet ? wo ist der unterschied beim weitergegebenen wert?

Autor: Tommy Letz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich meine natürlich eine cast funktion

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hängt vom Compiler ab ...
für gccavr beispielsweise ist float == double, was, wie wir kürzlich in
einer Diskussion hier herausgefunden haben, sogar ANSI-C (nach K&R, 2.
Auflage) - konform ist.

Da keines der Formate intern mit einer Dezimaldarstellung arbeitet
(sondern mit binärer Mantisse & Exponent), sieht die Konvertierung
höchstwahrscheinlich so aus, daß die am wenigsten signifikanten Bits
der Mantisse gestrichen werden.

Ich befürchte, daß das Verhalten obendrein auch noch
implementierungsspezifisch sein wird; wenn ich mich irre, wird mir
sicherlich wer widersprechen.

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Unterschied ist, dass float aus 4Byte besteht und double aus 8Byte.
float reicht glaube ich bis 8 nachkommerstellen und double bis 8. bin
mir aber nich ganz sicher.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der Unterschied ist, dass float aus 4Byte besteht und double
> aus 8Byte.

Wenn du Rufus' Post gelesen hättest, wüsstest du, dass eben das gerade
nicht der Fall ist. Auf deiner Architektur bei deinem Compiler mag das
stimmen, avrgcc z.B. hat aber andere Größen.

@Rufus:
> was, wie wir kürzlich in einer Diskussion hier herausgefunden
> haben, sogar ANSI-C-[...]-konform ist.
Du beziehst dich vermutlich auf:
http://www.mikrocontroller.net/forum/read-2-12872....
Dort wurde aber geschrieben, dass ein 4-Byte-double nicht
ANSI-C-konform ist (evtl. aber C++-konform).

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Chris: Wir haben beide recht.

float == double kann zulässig sein, hängt aber von der Genauigkeit ab:

  "noch alles offen, an anderer Stelle wird es jedoch deutlicher,
  weil als Mindestanforderung an die Genauigkeit gilt:

  FLT_DIG                          6
  DBL_DIG                         10
  LDBL_DIG                        10

  Und das ist mit 32bit double nicht zu schaffen.
  Zwar darf also float = double = long double gelten,
  aber eben nur,
  wenn dabei mindestens 10 Dezimalstellen herauskommen."

(Post von A.K. 14:14 im von Dir zitierten Thread, auf den ich mich in
der Tat bezog).



Damit ist allerdings noch nicht geklärt, ob

  float a;
  double b;

  a = b;

ein anderes Resultat liefert als

  a = (float) b;

Was dazu der ANSI-C-Standard aussagt und wie das jeweils implementiert
wird, entzieht sich leider gänzlich meiner Kenntnis.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rufus: Autsch, stimmt. Sorry. Ich hab dein Post irgendwie anders
gelesen, dachte du hättest float = double = 4 Bytes geschrieben.

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.