重複の可能性:
Cプログラミング部門
次のコード例では、結果は130.0になるはずですが、コンパイルすると129.0になります。右側は正確な結果を得るのに十分な精度を生み出していませんか?これを回避する方法はありますか?
#include<stdio.h>
int main(void) {
double sum = ((117+130)/3) + ((130+13)/3);
printf("sum: %f\n", sum);
}
重複の可能性:
Cプログラミング部門
次のコード例では、結果は130.0になるはずですが、コンパイルすると129.0になります。右側は正確な結果を得るのに十分な精度を生み出していませんか?これを回避する方法はありますか?
#include<stdio.h>
int main(void) {
double sum = ((117+130)/3) + ((130+13)/3);
printf("sum: %f\n", sum);
}
観察しているのは、 整数の切り捨ての結果です。2つの整数オペランドを使用して整数除算を実行すると、結果は別の整数になり、小数部分は破棄されます。これは丸めとは異なることに注意してください。たとえば、切り捨てを使用すると3.8は3になります。
これにより、期待される出力が得られます。
double sum = ((117+130) / 3.0) + ((130+13) / 3.0);
で割るので3.0
はなく3
。
つまり、整数除算のオペランドの少なくとも1つ、または両方がfloat型の場合、結果はfloatになります。(ここでは、int
sと切り捨てに関してfloat / doubleをある程度互換的に使用していることに注意してください)
値に.
またはを追加することに加えて(以下の@Morwennの役立つコメントで指摘されているように、を生成し、-を生成します)、intをfloatに明示的にキャストすることもできますが、それを行う場合は重要です。簡単な例(この例では、がであるため、値は割り当て後のようになることに注意してください):.0
.0
double
.0f
float
float
v
float
float v = 0;
/* values shown are BEFORE assignment */
v = (5 / 2); /* value is 2 due to integer truncation before assignment */
v = (float) (5 / 2); /* 2.0 as integer division occurs 1st, then cast to float */
v = (float) 5 / 2; /* 2.5 since 5 becomes 5.0 through casting first. */
上記の例を除算とフローティングポイントから借りました
sum
として宣言しますfloat
が、操作の右側は整数のみで構成されているため、整数式として扱われ、除算は切り捨てられます。試す
double sum = ((117 + 130) / 3.0) + ((130 + 13) / 3.0);
代わりは。