Forum: PC-Programmierung C Programm seltsames Verhalten


von Aaron (Gast)


Lesenswert?

Hi

Ich fange mit der C programmierung an und habe ein seltsames Phänomen:
Wenn ich dieses Programm ausführe bekomme ich einen Wert von 123.449997 
und
1234.567000
Ist das normal?
Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{

        float d;
        double e;

        d=123.45;
        e=1234.567;

        printf("Variable d= %f\n",d);
        printf("Variable e= %lf\n",e);



    return 0;

}

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Aaron schrieb:
> Ist das normal?

ja

von Buchstaben Verwechsler (Gast)


Lesenswert?

@Wegstaben Verbuchsler
Eine Begründung wäre nicht schlecht...

von lalala (Gast)


Lesenswert?

Anders herum: welche der beiden Ausgaben kommt Dir komisch vor und was 
haettest Du stattdessen erwartet?

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Buchstaben Verwechsler schrieb:
> Eine Begründung wäre nicht schlecht...

war doch nicht Gegenstand der Frage.

von Aaron (Gast)


Lesenswert?

Die 123.449997 finde ich komisch das ist 0,000003 zu wenig. Wieso ist 
das so?

von Leute, Leute (Gast)


Lesenswert?

Probier das mal

d=123.45f;

von g457 (Gast)


Lesenswert?

> Wieso ist das so?

[0]

HTH

[0] http://de.wikipedia.org/wiki/Gleitkommazahl

von Kaj (Gast)


Lesenswert?

Aaron schrieb:
> Ist das normal?
Jop. Versuch doch mal die Zahle binär darzustellen, dann wirst du von 
alleine feststellen, warum du nicht die erwarteten werte bekommst. 
(Stichworte: Rechnerinterne darstellung, Binäres Zahlensystem, und 
ähnliches)

Grüße

von lalala (Gast)


Lesenswert?

Epsilon ist 5e-8. Kommt hin. Vielleicht hier nachlesen 
http://de.m.wikipedia.org/wiki/IEEE_754

von (prx) A. K. (prx)


Lesenswert?

Aaron schrieb:
> Die 123.449997 finde ich komisch das ist 0,000003 zu wenig. Wieso ist
> das so?

Versuch mal, den Wert 0,1 als binäre Fliesskommazahl darzustellen. Also 
als Summe negativer Zweierpotenzen (sowas wie 1/16 + 1/32 + ...).

von Kaj (Gast)


Lesenswert?

Aaron schrieb:
> Wieso ist
> das so?
Du vergisst bei deiner Programmierung eins: Es gibt da Dinge, die sich 
Hardware nennen, in diesem Falle vornehmlich der Prozessor. Und der 
kann intern nur mit 0 und 1 rechnen. Ergo müssen deine Zahlen in 
binär gewandelt werden. Und Binäreszahlensystem und Komma-Zahlen sind 
ein ganz schlechtes paar.

von (prx) A. K. (prx)


Lesenswert?

Kaj schrieb:
> Und Binäreszahlensystem und Komma-Zahlen sind ein ganz schlechtes paar.

Keineswegs. Nur mit dezimalen Kommazahlen paart sich das schlecht.

von Leute, Leute (Gast)


Angehängte Dateien:

Lesenswert?

> Keineswegs. Nur mit dezimalen Kommazahlen paart sich das schlecht.

Siehe Anhang!

:)

von (prx) A. K. (prx)


Lesenswert?

Aaron schrieb:
>         printf("Variable d= %f\n",d);

Mehr Dezimalstellen auszugeben als im Format darstellbar sind führt zu 
solchen Effekten. Versuch mal:
  printf("Variable d= %.6e\n",d);

von heinz (Gast)


Lesenswert?

@Kaj
Das stimmt so nicht ganz. Man könnte auch im 10er System rechnen (BCD) 
ist halt verschwenderisch.

von Kaj (Gast)


Lesenswert?

A. K. schrieb:
> Keineswegs. Nur mit dezimalen Kommazahlen paart sich das schlecht.

Leute, Leute schrieb:
> Siehe Anhang!
>
> :)

heinz schrieb:
> @Kaj
> Das stimmt so nicht ganz

Ist ja gut, habt ja recht. :)
Ich versuche es nochmal: Aufgrund der begrenzten Genauigkeit (welche aus 
dem Binaerenzahlensystem resultiert) bei der rechnerinternen 
Darstellung, koennen Kommazahlen problematisch werden, wenn es um die 
genaue Darstellung geht.
Jetzt ist aber genug. :P

Gruesse

von (prx) A. K. (prx)


Lesenswert?

Kaj schrieb:
> Ich versuche es nochmal: Aufgrund der begrenzten Genauigkeit (welche aus
> dem Binaerenzahlensystem resultiert)

Auch ein dezimales Format hat eine begrenzte Genauigkeit, und die ist 
bei gleicher Anzahl Bits zudem schlechter als in binärem Format. Es ist 
einfach so, dass sich Dezimalzahlen oft nicht exakt im Binärformat 
darstellen lassen.

von Rolf Magnus (Gast)


Lesenswert?

Es gibt periodische Zahlen, wie z.B. 1/3. Diese kann man direkt nicht 
darstellen, da sie unendlich viele Nachkommastellen haben. Welche Zahlen 
periodisch sind, hängt aber vom Zahlensystem ab. Im 3er-System wäre 1/3 
z.B. schlicht 0,1.
Computer rechnen nun (abgehsehen vom genannten BCD-Format) im 
2er-System, wodurch eben manche Komma-Zahlen, die im Zehner-System 
einfach aussehen, in einem Computer gar nicht darstellbar, da periodisch 
sind. 0,1 im 10er-System ergibt im 2er-System eine periodische Zahl 
(0,000110011001100110011001100110011...). Da aber Computer nicht 
unendlich Speicher und Rechenkapazität haben, muß die Zahl irgendwo 
abgeschnitten werden, und es ergibt sich zwangsläufig eine Abweichung.

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.