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


von Tommy Letz (Gast)


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?

von Tommy Letz (Gast)


Lesenswert?

ich meine natürlich eine cast funktion

von Rufus T. Firefly (Gast)


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.

von Schoaschi (Gast)


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.

von Chris (Gast)


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.html#189351
Dort wurde aber geschrieben, dass ein 4-Byte-double nicht
ANSI-C-konform ist (evtl. aber C++-konform).

von Rufus T. Firefly (Gast)


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.

von Chris (Gast)


Lesenswert?

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

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.