3

重複の可能性:
Cプログラミング部門

次のコード例では、結果は130.0になるはずですが、コンパイルすると129.0になります。右側は正確な結果を得るのに十分な精度を生み出していませんか?これを回避する方法はありますか?

#include<stdio.h>
int main(void) {
    double sum = ((117+130)/3) + ((130+13)/3);
    printf("sum: %f\n", sum);
}
4

2 に答える 2

7

観察しているのは、 整数の切り捨ての結果です。2つの整数オペランドを使用して整数除算を実行すると、結果は別の整数になり、小数部分は破棄されます。これは丸めとは異なることに注意してください。たとえば、切り捨てを使用すると3.8は3になります。

これにより、期待される出力が得られます。

double sum = ((117+130) / 3.0) + ((130+13) / 3.0);

で割るので3.0はなく3

つまり、整数除算のオペランドの少なくとも1つ、または両方がfloat型の場合、結果はfloatになります。(ここでは、intsと切り捨てに関してfloat / doubleをある程度互換的に使用していることに注意してください)

値に.またはを追加することに加えて(以下の@Morwennの役立つコメントで指摘されているように、を生成し、-を生成します)、intをfloatに明示的にキャストすることもできますが、それを行う場合重要です。簡単な例(この例では、がであるため、値は割り当てのようになることに注意してください):.0.0double.0ffloatfloat vfloat

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. */

上記の例を除算とフローティングポイントから借りました

于 2012-06-21T10:46:04.893 に答える
4

sumとして宣言しますfloatが、操作の右側は整数のみで構成されているため、整数式として扱われ、除算は切り捨てられます。試す

double sum = ((117 + 130) / 3.0) + ((130 + 13) / 3.0);

代わりは。

于 2012-06-21T10:45:57.417 に答える