PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c float Nachkommastellen bei printf



eXi
30.10.2013, 22:42:17
Hey,

sind unter euch ein paar die in c programmieren können? Ich muss vonner Uni aus damit paar leichte Sachen programmieren, was auch keine Probleme macht, aber mich stört folgendes.


#include <stdio.h>
#include <math.h>


int main()
{

float p = 0; /*Initialisierung der notwendigen Variablen*/
float q = 0;

float x1 = 0;
float x2 = 0;

printf(" p und q eingeben: "); /*Eingabeaufforderung für p und q*/
scanf(" %f %f", &p, &q);

printf(" Eigegebene Gleichung: x^2 + %.2fx + %.2f = 0\n", p ,q); /*Ausgabe der Zwischengleichung*/
float test = 0;



if((p*p)/4 - q < 0) /*Überpruefung des Wertes unter der Wurzel*/
{ /*Anschließende Berechnung und Ausgabe von x1 und x2...*/
printf(" Keine Loesung. "); /*...hinsichtliches des Wertes unter der Wurzel*/
}
else if((p*p)/4 - q == 0)
{
x1 = -p/2;
printf(" Eine Loesung: x1/x2 = %.1f ", x1);
}
else if((p*p)/4 - q > 0)
{
x1 = -p/2 + sqrt((p*p)/4 - q);
x2 = -p/2 - sqrt((p*p)/4 - q);

printf(" Zwei Loesungen: x1 = %.1f, x2 = %.1f", x1, x2);
}
return 0;
}


Das ist das Script, welches ich für die Aufgabe kurz geschrieben habe. Mein Problem ist das optische bei der Ausgabe. Ich hab die Ausgabe hier mal auf 1 bzw 2 Nachkommastellen beschränkt, aber auch dort tritt folgendes auf:

Wenn der Benutzer p und q eingibt und dort eine ganze Zahl oder eine mit nur einer Nachkommastelle nimmt, dann wird bei der Zwischenausgabe der quadratischen Gleichung immer mit Nullen aufgefüllt.
Also bei einer 3 steht in der Ausgabe 3.00. Gibt es in c irgendeine Formatierung, welche automatisch die überflüssigen Nullen abschneidet? Über google finde ich nur selbst gebastelte Lösungen.
Ich fände es besser, wenn ich endlos viele Nachkommastellen erlauben könnte und er die Zahl dann halt einfach wieder ausgibt.

Wenn ich zB 4 Nachkommastellen erlaube in der Ausgabe, dann sind die Zahlen zB 3.0000 , 3.1200, 3.1234. Ich will aber 3, 3.12 und 3.1234 haben. So werden momentan nämlich auch größere Zahlen wie 3.12345 einfach abgeschnitten.

Ich hoffe man versteht was ich meine.

PS: Die test Variable wegdenken, die hab ich beim löschen übersehen.

eMo
31.10.2013, 00:03:46
Soweit ich weiß geht das nicht, hat aber auch einen einfachen Grund:
Die Strukturierung von Outputdateien jeglicher Art wird dadurch wesentlich vereinfacht. Dies erhöht die Übersichtlichkeit z.B. bei Tabellen immens, wenn man keine .csv nutzt.
Ansonsten auf String casten und die Positionen der letzten Null finden, mit der Länge des Strings vergleichen und einen Substring erstellen. ;)

Edit: Doch, klar geht das, gib mir einen Moment.
http://www.cplusplus.com/reference/cstdio/printf/
Geht afaik doch nicht, kannst aber mal g probieren, vllt schneidet das automatisch ab ;)


(p*p)/4 - q == 0
Schande über dein Haupt! Du musst, da es sich hier um floats handelt, schauen, ob der Absolutwert kleiner einer Toleranz ist, da hier die Rechengenauigkeit sonst schnell einen Strich durch die Rechnung macht.
10^-6 ist hier ein guter Wert, den haben wir zumindest in Numerik I immer genutzt :D

eXi
31.10.2013, 13:20:56
:ugly: Erschlag mich, für den Zweck dieser Aufgabe reicht es den Wert so stupide zu vergleichen.

EDIT: %g macht es soweit. Das hab ich gesucht. Wieso hab ich das nicht gefunden über google -.- gibt die Zahl nach dem musster ddd.ddd aus. Also ab der erste Stelle ungleich 0 6 Zahlen. zB 0.0123456 oder 0.123045

Der Rest wird gerundet. Reicht mir soweit erstmal. Danke dir! :prestige: