私は実際には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;
}