3

なぜこれを行うのですか:

int main(void)
{
    short w = 30;
    return  1.2 * w;
}

35を返しますか?

4

7 に答える 7

14

より適切な結果を取得したい場合は、次のことを試してください。

return 12*w/10
于 2010-09-28T09:36:34.747 に答える
12

1.2 * wです36.0。正確に表現されていないことを意味する double 型があります。

よりもわずかに小さいことが判明する可能性が高いため3635.99999それを返すと小数部分が破棄され、整数部分のみが返されます。それがあなたが得る方法です35


PS 浮動小数点演算はすべて正確ではありません。少しの相違を期待する必要があります。また、浮動小数点値と固定値を比較する場合は、直接比較するのではなく、範囲比較を行う必要があります。

違う:if (value == 36.0) { /* ... */ }

正しい:if (abs (value - 36.0) < 0.0001) { /* ... */ }

于 2010-09-28T09:28:23.377 に答える
3

これは、2 進浮動小数点の精度の問題です。1.2は 1.2 よりわずかに小さいため、乗算の結果は 36 よりわずかに小さくなります。

于 2010-09-28T09:29:17.307 に答える
3

表現のため:1.2は実際には1.1999999のようなものです

于 2010-09-28T09:29:44.413 に答える
3

浮動小数点演算は不正確になる可能性があるround()ため、より良い結果を得るには、整数にキャストする前に使用してください。

#include <math.h>
...
return (int)round(some_real_value);
于 2010-09-28T16:35:08.753 に答える
1

浮動小数点演算で完全に正確な結果を期待しないでください。乗算結果は、たとえば、35 に丸められた 35.9999 になる場合があります。

于 2010-09-28T09:29:27.573 に答える
0

短い w = 30; 1.2 * w を返します。

return ステートメントでは、1.2 は double 型であるため、最初の並べ替え値は double にキャストされた型であるため、1.2 * 30.000000 を乗算し、結果は約 35.999999 になり、関数の戻り値の型は int であるため、小数部は切り捨てられ、35 のみが返されます。

于 2010-09-28T09:53:20.553 に答える