Forum: Mikrocontroller und Digitale Elektronik Printf Ausgabe


von Paul (Gast)


Lesenswert?

Hi,

wie kann eine Zeit, die ich in Sekunde bekommen in ms umrechen und mit 
Hilfe von printf mit 4 Zahlen anzeigen
Beispiel:
double dInitZeit= 0,031(s);
double dZeit =dInitZeit*1000(s);
Für die Ausgabe möchte ich jedes mal kein komma anzeigen sonder nur 
sZeit mit 4 numerische(z.B. 0031) Werte.
Ich habe so probiert aber geht nicht.
printf( "%f", dZeit );
printf( "%04f", dZeit  );

Danke

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> Hi,
>
> wie kann eine Zeit, die ich in Sekunde bekommen in ms umrechen und mit
> Hilfe von printf mit 4 Zahlen anzeigen
> Beispiel:
> double dInitZeit= 0,031(s);


Gleitkommazahlen werden in Programmiersprachen mit einem PUNKT 
geschrieben (amerikanische Schreibweise!)

Das hier, mit einem Komma, compiliert auch. Aber es bedeutet in C etwas 
völlig anderes.

> double dZeit =dInitZeit*1000(s);

> Für die Ausgabe möchte ich jedes mal kein komma anzeigen sonder nur
> sZeit mit 4 numerische(z.B. 0031) Werte.
> Ich habe so probiert aber geht nicht.
> printf( "%f", dZeit );
> printf( "%04f", dZeit  );

Und was genau bedeutet jetzt 'geht nicht'?

Wenn du keine Kommazahlen haben willst, dann willst du ganze Zahlen 
haben. Eine ganze Zahl nennt sich in Programmiersprachen ein Integer. In 
C zb ein int. Wenn du also deine double zuerst in einen int umwandelst, 
dann sind die Kommastellen automatisch weg.


   printf( "%04d", (int)(dZeit + 0.5) );

(Ich geh mal davon aus, dass dZeit nicht negative werden wird, denn dann 
müsste man die Rundungskorrektur in die andere Richtung machen. Und ich 
geh davon aus, dass deine Zeiten nicht so groß werden, dass sie nicht 
mehr in einen int passen. Sonst müsste man zb auf long ausweichen)

von Georg G. (df2au)


Lesenswert?

Sind bei deinem Compiler die Formate "Float" und "Double" identisch? 
Wenn nein, solltest du dich entscheiden, was es sein soll.

von Paul (Gast)


Lesenswert?

Hi,

erstmal danke für die Rückmeldung.
dInitZeit kann positiv/negativ sein. Ich muss mir nur es merken, wenn es 
negativ ist dann bei der Ausgabe das Vorzeichen vorne anhängen.
Ich verstehe nich warum Du dZeit +0.5 addiere.

von Paul (Gast)


Lesenswert?

sorry ich habe natürlich gemeint . statt ,

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Paul schrieb:
> Ich verstehe nich warum Du dZeit +0.5 addiere.

Um Rundungsfehler zu minmieren.

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> Hi,
>
> erstmal danke für die Rückmeldung.
> dInitZeit kann positiv/negativ sein. Ich muss mir nur es merken, wenn es
> negativ ist dann bei der Ausgabe das Vorzeichen vorne anhängen.
> Ich verstehe nich warum Du dZeit +0.5 addiere.

damit ein Ergebnis von

  3.99999999999

als 4 rauskommt und nicht als 3

von Paul (Gast)


Lesenswert?

als Ausgabe bekomme ich :312000001

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> als Ausgabe bekomme ich :312000001

ja, dann hast du irgendwas falsch gemacht.

Ändert aber nichts daran, dass man beim Übergang double -> int meistens 
eine Rundungskorrektur anbringt. Denn Floating Point rechnen krankt nun 
mal an den kleinen Rundungsfehlern, die einem das Leben schwer machen. 
Wer zu 0  10-mal 0.1 addiert und erwartet, dass da exakt 1.0 rauskommt, 
der hat mit Zitronen gehandelt.

WEnn du zum Rest Hilfe brauchst, dann poste deinen Code. Hier weiß ja 
niemand welche 5 anderen Fehler sich sonst noch so in deinem Code 
verstecken.

von Paul (Gast)


Lesenswert?

Bitte 003100001 aber möchte ich nur 0031 haben

von Paul (Gast)


Lesenswert?

Hi,
unter der Code

double dInitZeit = 0.0;
double dZeit = 0.0;
item.GetDoubleValue(EKEY_DOUBLE_DELAY_TIME,&dInitZeit);
dZeit = (dInitZeit*1000);
printf( "%04d", (int)((dZeit) + 0.5) );

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> Hi,
> unter der Code
>
> double dInitZeit = 0.0;
> double dZeit = 0.0;
> item.GetDoubleValue(EKEY_DOUBLE_DELAY_TIME,&dInitZeit);

und welchen Wert kriegst du hier?
Sicherlich nicht den Wert den du glaubst

> dZeit = (dInitZeit*1000);
> printf( "%04d", (int)((dZeit) + 0.5) );

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.