/ / Falsche Antwort der Durchschnittsfunktion? - c, Funktion, Variablen, Ganzzahldivision

Falsche Antwort der durchschnittlichen Funktion? - c, Funktion, Variablen, Ganzzahl-Division

Ich bin praktisch neu in der C-Programmierung, und ich habe versucht, eine einfache Durchschnittsfunktion richtig zu machen, aber der Bruchteil der Antwort wird immer durcheinander gebracht.

#include <stdio.h>
#include <float.h>

float cal(int num1,int num2,int num3);

int main(){
int a,b,c;
float avg;

a=10;
b=5;
c=11;

avg=cal(a,b,c);
printf("Average is : %En", avg);
return 0;
}

float cal(int num1,int num2,int num3){
float avg1;
avg1=(num1+num2+num3)/3;
return avg1;
}

Die Antwort (avg) sollte sein 8.66666666667aber stattdessen bekomme ich 8.00000000...

Antworten:

4 für die Antwort № 1

Sie machen hier eine ganzzahlige Division float (mindestens einer von ihnen) oder verwenden Sie Float-Literale vor der Division, um die Float-Division zu zwingen.

Zum Beispiel ändern

avg1=(num1+num2+num3)/3;

zu

avg1=(num1+num2+num3)/(float)3;  // 1. cast one to float
avg1=(num1+num2+num3)/3.0f;      // 2. use float literals

3 für die Antwort № 2

Ändere das

avg1=(num1+num2+num3)/3;

dazu

avg1=(num1+num2+num3)/(float)3;

Auf diese Weise erzwingen Sie eine Division durch einen Float.

Mit Ihrem Code führen Sie tatsächlich eine ganze Zahl ausDivision, was bedeutet, dass die Dezimalstellen verworfen werden. Das Ergebnis der Division wird dann einer Float-Nummer zugewiesen, die Dezimalstellen sind jedoch bereits weg. Deshalb müssen Sie mindestens einen Operanden der Division in einen Float umwandeln, um zu bekommen, was Sie wollen.


3 für die Antwort № 3

Dies liegt daran, dass hier alle Operanden ganzzahlig sind (num1+num2+num3)/3. Sie erhalten also eine ganzzahlige Division, die später in einen Float umgewandelt wird (d. H. Bei der Zuweisung, aber nach der Auswertung).

Sie müssen einen der Divisionsoperanden erstellen float, so wird der Rest umgewandelt werden. Und die Division wird eine float Einteilung.

Z.B:

(num1+num2+num3)/(float)3
(num1+num2+num3)/3.0f
((float)(num1+num2+num3))/3

Beachten Sie, dass die Zusätze aufgrund von Klammern noch ganzzahlige Zusätze sind. Eine nette Lektüre zu den Konvertierungsregeln ist here.


2 für die Antwort № 4

Erzwingen Sie, dass die Division in Fließkommazahlen ausgeführt wird

avg1=(num1+num2+num3)/3.0f;

Was in Ihrem Fall passiert, ist, dass Sie eine Ganzzahldivision durchführen und dann konvertiere es in float:

Resultierende Art von (num1+num2+num3)/3 ist eine ganze Zahl, während der Typ von (num1+num2+num3)/3.0f ist ein Schwimmer.

Ganzzahlige Division ergibt das Ergebnis ohne Dezimalpunkt.


2 für die Antwort № 5

Veränderung

avg1=(num1+num2+num3)/3;

zu

avg1=(float)(num1+num2+num3)/3;

Wenn Sie eine Ganzzahldivision durchführen, ist das Ergebnis auch eine Ganzzahl. Wie avg1 Ist bereits als Float deklariert, können Sie das Ergebnis der Operation in Floatwert umwandeln.


0 für die Antwort № 6

Sie können Ihren Code weiter vereinfachen

float cal(int num1,int num2,int num3){
return ((num1+num2+num3)/3.0);
}

Ändern Sie einfach den Wert 3 auf 3,0, da reicht es aus. Da das Upcasting manuell erfolgen muss, führt der Compiler nur das Downcasting aus.


0 für die Antwort № 7

Zusätzlich zu der gut umrissenen Notwendigkeit, Fließkommadivision anstelle von Ganzzahldivision zu verwenden, typisch float wird keine genaue Zahl wie 8.66666666667 aber nur bis 6 oder so Ziffern. Weitere, typische Konvertierung int (32-Bit) kann bei der Konvertierung nach zu Kürzungen führen float.

Für eine genauere Antwort mit 11 Ziffern auf die Rechte von ., benutzen double Anstatt von float

double cal(int num1,int num2,int num3){
double avg1;
avg1=(num1+num2+num3)/3.0;  // 3 --> 3.0
return avg1;
}

int main(void){  // added void
int a,b,c;
double avg;

a=10;
b=5;
c=11;

avg=cal(a,b,c);
// printf("Average is : %En", avg);
printf("Average is : %.11En", avg); // Print to 11 digits after the dp.
return 0;
}