Volumenberechnung falsches Ergebnis



  • Moin moin... bin noch relativ neu in C und bekomme bei der Volumenberechnung einer Kugel immer ein falsches Ergebnis.

    Hier mein Code:

    #include <stdio.h>
    
    int radius = 5;
    const double PI = 3.1416;
    double volumen = 0;
    main()
    {
    	printf("Der Radius der Kugel beträgt 5.\n");
    
    	volumen = (4/3)*radius*radius*radius*PI;
    
    	printf("Somit beträgt das Volumen: %lf \n",volumen);
    	printf("Und die Oberfläche:\n\n");
    
    	return 0;
    }
    

    Die AUsgabe sagt mir 392.700000. Eigentlich müsste aber (mit TR gerechnet und Vorgabe vom Prof^^) 523.598816 herauskommen. Wo liegt da der Fehler?

    mfg
    Roger 😉



  • (4/3) = 1

    (4.0f/3.0f) = 1.33333333f



  • Ah ok, jetzt funktioniert es 😉 Und was genau hat dieses f für eine Bedeutung? Bzw warum ist für ihn (4/3) eins?(wegen integer vllt. ?)

    mfg
    Roger



  • Du hast es genau schon selbst vorgeschlagen: 4 / 3 ist eine reine Integerberechnung, das f bei 4.0f steht für float. 4.0 alleine ist double 😉

    MfG



  • /rant/ schrieb:

    Du hast es genau schon selbst vorgeschlagen: 4 / 3 ist eine reine Integerberechnung, das f bei 4.0f steht für float. 4.0 alleine ist double 😉

    Da er double nimmt, macht ein float-Literal wenig sinn.



  • Aber warum funktioniert es dann? Bzw. was wär dein Lösungsansatz?

    mfg Roger



  • Es werden alle Fließkommaberechnungen in double gemacht.
    Nur beim ablegen in Variablen wird dann auf float "gekürzt"

    Und bei printf ist %f für double und float. Das liegt daran, das bei variabler Argumentenliste automatisch auf double gecastet wird.

    Roger292 schrieb:

    Bzw. was wär dein Lösungsansatz?

    - Lass die Klammern bei 4/3 weg und schreib das PI an den Anfang (dann fängt die Berechnung mit einem double an)
    - schreib zumindest das Komma bei Fließkommazahlen 4./3 oder 4.0/3 oder 4f/3



  • DirkB schrieb:

    oder 4f/3

    4f geht lustigerweise nicht. f ist kein gültiger Suffix für eine Ganzzahlkonstante.



  • Ganz einfach 4.0/3.0 schreiben dann klappts auch mit Fließkommazahlen.



  • Roger292 schrieb:

    Moin moin... bin noch relativ neu in C und bekomme bei der Volumenberechnung einer Kugel immer ein falsches Ergebnis.

    Hier mein Code:

    #include <stdio.h>
    
    int radius = 5;
    const double PI = 3.1416;
    double volumen = 0;
    main()
    {
    	printf("Der Radius der Kugel beträgt 5.\n");
    
    	volumen = (4/3)*radius*radius*radius*PI;
    
    	printf("Somit beträgt das Volumen: %lf \n",volumen);
    	printf("Und die Oberfläche:\n\n");
    
    	return 0;
    }
    

    Die AUsgabe sagt mir 392.700000. Eigentlich müsste aber (mit TR gerechnet und Vorgabe vom Prof^^) 523.598816 herauskommen. Wo liegt da der Fehler?

    mfg
    Roger 😉

    Die Konstante PI gibts in math.h als M_PI. Also include<math.h> und dann kannst du schon auf M_PI zufreifen.
    Außerdem sollte man Variablen besser lokal als global definieren.
    Also hau die Variablen radius und volumen in die main Funktion rein.
    Spätestens bei großen Projekten verzweifelt man wenn es tausende globale Vars gibt, anstatt Funktionsargumente zu nutzen.



  • Nö, in math.h gibbet kein M_PI. Außerdem muss es int main heißen. (Muss man in C eigentlich void hineinschreiben?)



  • 314159265358979 schrieb:

    Nö, in math.h gibbet kein M_PI. Außerdem muss es int main heißen. (Muss man in C eigentlich void hineinschreiben?)

    Du kannst kein C.

    In C89 muss es nicht int main heißen.

    Zu deiner Frage: void main ist kein legales C und auch kein legales C++.

    Hier ein Link: http://www.c-plusplus.net/forum/39346 (Hoffentlich habe ich dich nicht mit dem Link gekränkt, wenn schon: Dann tick woanders aus)



  • 314159265358979 schrieb:

    Nö, in math.h gibbet kein M_PI. Außerdem muss es int main heißen. (Muss man in C eigentlich void hineinschreiben?)

    Doch doch, ist normalerweise dabei.
    Zwar nicht im Standard verlangt (#ifndef __STRICT_ANSI__) aber doch jedes Mal noch mitgeliefert gewesen bei den von mir verwendeten Compilern.

    Auszug aus math.h

    #ifndef __STRICT_ANSI__
    #define M_E		2.7182818284590452354
    #define M_LOG2E		1.4426950408889634074
    #define M_LOG10E	0.43429448190325182765
    #define M_LN2		0.69314718055994530942
    #define M_LN10		2.30258509299404568402
    #define M_PI		3.14159265358979323846
    #define M_PI_2		1.57079632679489661923
    #define M_PI_4		0.78539816339744830962
    #define M_1_PI		0.31830988618379067154
    #define M_2_PI		0.63661977236758134308
    #define M_2_SQRTPI	1.12837916709551257390
    #define M_SQRT2		1.41421356237309504880
    #define M_SQRT1_2	0.70710678118654752440
    #endif
    


  • just lols schrieb:

    314159265358979 schrieb:

    Nö, in math.h gibbet kein M_PI. Außerdem muss es int main heißen. (Muss man in C eigentlich void hineinschreiben?)

    Du kannst kein C.

    In C89 muss es nicht int main heißen.

    Zu deiner Frage: void main ist kein legales C und auch kein legales C++.

    Hier ein Link: http://www.c-plusplus.net/forum/39346 (Hoffentlich habe ich dich nicht mit dem Link gekränkt, wenn schon: Dann tick woanders aus)

    Soweit ich das im Kopf habe ist eine Funktion ohne return Typ Angabe automatisch int (bin mir nicht sicher weil ich natürlich auch bei int dieses int auch hinschreibe ... alleine schon der Übersichtlichkeit halber). Also würde main(...) reichen.


Anmelden zum Antworten