Forum: PC-Programmierung [c] printf: float auf Gesamtstellen formatieren


von dotm (Gast)


Lesenswert?

Hallo.
Hab alles mögliche schon probiert und glaub daher es geht nicht.
Ich möchte genau 6 Zahlen mit printf ausgeben, die nachkommastellen 
sollen je nach grösse der Zahl mehr oder weniger sein.
also
1
float fritzi_stinkt = 0.123456789;
2
//hier irgendeine printf formatierung
3
AUSGABE: 1.12345
1
float fritzi_stinkt = 12.123456789;
2
//hier irgendeine printf formatierung
3
AUSGABE: 12.1234
1
float fritzi_stinkt = 123.123456789;
2
//hier irgendeine printf formatierung
3
AUSGABE: 123.123

Ist das mittels printf möglich?
Danke..
M.

von dotm (Gast)


Lesenswert?

Es sollte nur printf sein nicht sprintf oder snprintf oder vprintf oder 
so..

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

dotm schrieb:
> Ist das mittels printf möglich?

Nicht direkt.  Indirekt geht es, indem du die nötige Zahl
Dezimalstellen vorberechnest:
1
void print_formatted(double d)
2
{
3
  int i = 5;
4
  if (d > 100) i = 3;
5
  else if (d > 10) i = 4;
6
  printf("%7.*f", i, d);
7
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du wirst nicht umhinkommen, vor dem Aufruf von printf die Anzahl der 
Stellen vor dem Komma zu bestimmen und die dann beim Aufruf anzugeben 
(via %*.*f).

Hättest Du keine snprintf-Allergie, könntest Du in einen 8 Zeichen 
großen Puffer (sechs Ziffern, Dezimalpunkt und \0) ausgeben ...

von dotm (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Nicht direkt.  Indirekt geht es, indem du die nötige Zahl
> Dezimalstellen vorberechnest:

Okay danke!

von dotm (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Hättest Du keine snprintf-Allergie

:)
Diese Allergie hab nicht ich sondern das schon feststehende 
Codekonstrukt...

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Das blöde Minus nicht vergessen!

von dotm (Gast)


Lesenswert?

Michael Reinelt schrieb:
> Das blöde Minus nicht vergessen!

Gerade im moment gemerkt. verflucht.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

dotm schrieb:
> verflucht

ich hoffe das minus und nicht mich (don't kill the messenger) :-)

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Hättest Du keine snprintf-Allergie, könntest Du in einen 8 Zeichen
> großen Puffer (sechs Ziffern, Dezimalpunkt und \0) ausgeben ...

Weils mir grad einfällt: Past snprintf dann die genauigkeit automatisch 
an? Und brücksichtigt auf eventuell notwendige Rundungen?

123.456 => 123.5 und nicht 123.4

von tictactoe (Gast)


Lesenswert?

dotm schrieb:
> Ich möchte genau 6 Zahlen mit printf ausgeben, die nachkommastellen
> sollen je nach grösse der Zahl mehr oder weniger sein.
1
printf("%.6g", fritzi_stinkt);

Nullen am Ende werden aber weggelassen, sodass auch weniger als 6 
Stellen gedruckt werden, und wenn die Zahl mehr als 6 Vorkommastellen 
hat oder kleiner als 0.0001 ist, wird auf wissenschaftliche Darstellung 
umgeschaltet.

von Udo S. (urschmitt)


Lesenswert?

dotm schrieb:
> float fritzi_stinkt = 123.123456789;

Nur als Hinweis:
Dir ist aber schon bewusst, daß float nur etwa 5-6 signifikante Stellen 
hat.
Das heisst spätestens die Stellen ...456789 sind reine Makulatur.

Schon klar, du willst eh nur 6 stellen ausgeben, aber schon die 6. 
könnte bei einigen Rechenoperationen nur mehr Zufall sein.

von dotm (Gast)


Lesenswert?

tictactoe schrieb:
> Stellen gedruckt werden, und wenn die Zahl mehr als 6 Vorkommastellen
> hat oder kleiner als 0.0001 ist, wird auf wissenschaftliche Darstellung

Genial! Kann ich die Umschaltung eventuell unterdrücken?

von dotm (Gast)


Lesenswert?

Udo Schmitt schrieb:
> Dir ist aber schon bewusst, daß float nur etwa 5-6 signifikante Stellen
> hat.

Klar. war nur als Beispiel gedacht.

Michael Reinelt schrieb:
> don't kill the messenger

Klar. Ich kann in der Formatierung noch das vorzeichen erzwingen
1
printf("%+7.3f", eine_tolle_zahl);
aber wenn ich für vorzeichenlose Float eine Stelle mehr haben will muss 
davor noch mehr herumgerechne stehen.

von dotm (Gast)


Lesenswert?

Michael Reinelt schrieb:
> Weils mir grad einfällt: Past snprintf dann die genauigkeit automatisch
> an? Und brücksichtigt auf eventuell notwendige Rundungen?

Meines Wissens nicht. Und wegen dem hier:

tictactoe schrieb:
> Nullen am Ende werden aber weggelassen, sodass auch weniger als 6
> Stellen gedruckt werden

Ist die einzige wirklich korrekt Lösung mit Bezug auf
Beitrag "Re: [c] printf: float auf Gesamtstellen formatieren"
so was in etwa:
1
void print_formatted(double d)
2
{
3
  int i = 5;
4
  if (d > 100) i = 3;
5
  else if (d > 10) i = 4;
6
  if (d < 0) i--;
7
  printf("%7.*f", i, d);
8
}
Für zahlen > 999 ist das ganze dann dementsprechend zu erweitern. Nicht 
allzu super...

von m.n. (Gast)


Lesenswert?

dotm schrieb:
> float fritzi_stinkt = 12.123456789;
> //hier irgendeine printf formatierung
> AUSGABE: 12.1234

Bei gewünschter Formatierung wird Dir printf() aber den gerundeten Wert 
ausgeben: 12.1235

von dotm (Gast)


Lesenswert?

m.n. schrieb:
> Bei gewünschter Formatierung wird Dir printf() aber den gerundeten Wert
> ausgeben: 12.1235

ist gewünscht.

von tictactoe (Gast)


Lesenswert?

dotm schrieb:
> tictactoe schrieb:
>> Stellen gedruckt werden, und wenn die Zahl mehr als 6 Vorkommastellen
>> hat oder kleiner als 0.0001 ist, wird auf wissenschaftliche Darstellung
>
> Genial! Kann ich die Umschaltung eventuell unterdrücken?

Die bei Zahlen kleiner 0.0001 nicht. Hast du solche Zahlen überhaupt?

Die obere Grenze richtet sich nach den gewünschten Ziffern, also bei 
"%.8g" wird erst bei mehr als 8 Vorkommastellen umgeschaltet.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Wie sollen Zahlen kleiner als 1 oder größer als 1E6 ausgegeben werden?

Und wie die Null?

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.