/ /平均関数の間違った答え? - c、関数、変数、整数除算

平均的な機能の間違った答え? - c、関数、変数、整数除算

私は実際にはCのプログラミングには新しく、単純な平均関数を取得しようとしていましたが、答えの小数部分が乱れています...?

#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;
}

答え (avg)は 8.66666666667、代わりに私は得る 8.00000000...

回答:

回答№1は4

あなたはここで整数除算をしています。 float (少なくとも1つ)を使用するか、除算前に浮動小数点数を使用して浮動小数点除算を使用するようにします。

たとえば、変更

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

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

回答№2の場合は3

これを変更する

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

これに

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

そうすれば、浮動小数点数で除算を強制します。

あなたのコードでは、実際に整数小数点以下桁が破棄されることを意味します。その後、除算の結果は浮動小数点数に割り当てられますが、小数点はすでに消えています。そのため、あなたが望むものを得るためには、部門の少なくとも1つのオペランドをフロートにキャストする必要があります。


回答№3の場合は3

すべてのオペランドがここでは整数であるからです (num1+num2+num3)/3。したがって、整数の除算が得られます。この除算は、後で浮動小数点に変換されます(つまり、代入時に、評価後に)。

分割オペランドの1つをaにする必要があります。 float残りは変換されます。そして、部門は float 分割。

例えば:

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

括弧のため、加算は整数加算であることに注意してください。 コンバージョンルールの良い読み方は here.


答え№4の2

除算を浮動小数点形式に強制する

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

あなたのケースで何が起こるかは、整数除算を実行し、 次に それを浮動小数点に変換する:

結果のタイプ (num1+num2+num3)/3 は整数であるが、 (num1+num2+num3)/3.0f フロートです。

整数部は小数点なしで結果を返します。


回答№5の2

変化する

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

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

整数除算を実行すると、結果も整数になります。 として avg1 既に浮動小数点数として宣言されている場合、浮動小数点値を取得するために演算結果をキャストできます。


答え№6の場合は0

コードをさらに単純化することができます

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

アップキャスティングを手動で行わなければならないので、コンパイラはダウンキャストのみを実行するため、値3を3.0に変更してください。


回答№7は0

整数の除算ではなく浮動小数点の除算を使用する必要があることはよく指摘されています float のような正確な数字を提供しません 8.66666666667 6桁程度にしかならない。さらに、典型的な int (32ビット)を使用すると、変換時に切り捨てられることがあります float.

より正確な答えを11桁の権利に .、 つかいます double の代わりに 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;
}