PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Konvertierung von 'double' in 'float'



darxun
28-11-2007, 16:12
Mein Prg:


#include <stdio.h>
#define Pi 3.14159265
int main()
{
float fRadius=0, fOberflaeche=0, fVolumen=0;

/* Eingabe und Ausgabe des Radiuses */
printf("Geben Sie den Radius der Kugel ein \n\n\n");
scanf(" %f", &fRadius);
printf("\n\n\n Der Radius betraegt: %0.2lf\n\n\n", fRadius);

/* Berechnung und Ausgabe des Volumens */
fVolumen=(4.0/3.0)*(fRadius*fRadius*fRadius)*Pi;
printf("\n Das Volumen betraegt: %0.0lf\n\n\n", fVolumen);

/* Berechnung und Ausgabe der Oberfläche */
fOberflaeche=4.0f*(fRadius*fRadius)*Pi;
printf("\n Die Oberflaeche betraegt: %0.1f\n\n\n\n\n\n\n\n" , fOberflaeche);

return 0;
}


Warum erscheint in Bezug auf die roten Zeilen die folgende Warnung?


Warnung:

warning C4244: '=': Konvertierung von 'double' in 'float', möglicher Datenverlust

ContainerDriver
28-11-2007, 16:32
Ich vermute, der Präprozessor ersetzt Pi durch den im define angegebenen Wert und der Compiler fasst das dann als double auf. Da float aber eine größere Mantisse und Exponenten hat und eine Umwandlung von double zu float vorgenommen wird, gibt der Compiler eine Warnung aus. Eventuell hilft ein



#define Pi 3.14159265f
, oder du änderst den Datentypen der Variablen (und der Zahlen in den Rechnungen) zu double.

darxun
28-11-2007, 16:53
Bei
#define Pi 3.14159265f

erscheint die gleiche Warnung noch für die letzte rot markierte Zeile.

Für
double fRadius=0, fOberflaeche=0, fVolumen=0;

werden sämtliche Ausgabewerte bei Eingabe des Radiuses (also im Prg) null.

Boron
28-11-2007, 16:56
Wenn du Oberfläche, Radius und Volumen als double anlegst, dann solltest du im printf(...) auch double ausgeben. Vermutlich dann mit %0.0ld.

darxun
28-11-2007, 17:05
Mit deinem Vorschlag wird der Radius in der Ausgabe viel zu groß (größer als dessen Eingabe), das Volumen wird nicht ausgegeben und die Oberfläche ist null.

Ich habe gerade herausgefunden dass das Ganze so funktioniert:


#include <stdio.h>

int main()
{
float fRadius=0;
double fOberflaeche=0, fVolumen=0, Pi=3.14159265;

/* Eingabe und Ausgabe des Radiuses */
printf("Geben Sie den Radius der Kugel ein \n\n\n");
scanf(" %f", &fRadius);
printf("\n\n\n Der Radius betraegt: %0.2lf\n\n\n", fRadius);

/* Berechnung und Ausgabe des Volumens */
fVolumen=(4.0/3.0)*(fRadius*fRadius*fRadius)*Pi;
printf("\n Das Volumen betraegt: %0.0lf\n\n\n", fVolumen);

/* Berechnung und Ausgabe der Oberfläche */
fOberflaeche=4.0f*(fRadius*fRadius)*Pi;
printf("\n Die Oberflaeche betraegt: %0.1lf\n\n\n\n\n\n\n\n" , fOberflaeche);

return 0;
}

Allerdings würde ich auch gerne noch verstehen warum es so geht und anders (siehe erste Thread) nicht.

ContainerDriver
28-11-2007, 17:16
Bei
#define Pi 3.14159265f

erscheint die gleiche Warnung noch für die letzte rot markierte Zeile.


Das ist auch richtig so!



/* Berechnung und Ausgabe der Oberfläche */
fOberflaeche=4.0f*(fRadius*fRadius)*Pi;
printf("\n Die Oberflaeche betraegt: %0.1f\n\n\n\n\n\n\n\n" , fOberflaeche);


Schau da mal genau hin.

EDIT: Stopp, das sollte eigentlich nicht die Warnung verursachen. Im moment weiß ich auch nicht, warum da noch eine Warnung angezeigt wird...