なぜこれを行うのですか:
int main(void)
{
short w = 30;
return 1.2 * w;
}
35を返しますか?
なぜこれを行うのですか:
int main(void)
{
short w = 30;
return 1.2 * w;
}
35を返しますか?
より適切な結果を取得したい場合は、次のことを試してください。
return 12*w/10
1.2 * w
です36.0
。正確に表現されていないことを意味する double 型があります。
よりもわずかに小さいことが判明する可能性が高いため36
、35.99999
それを返すと小数部分が破棄され、整数部分のみが返されます。それがあなたが得る方法です35
。
PS 浮動小数点演算はすべて正確ではありません。少しの相違を期待する必要があります。また、浮動小数点値と固定値を比較する場合は、直接比較するのではなく、範囲比較を行う必要があります。
違う:if (value == 36.0) { /* ... */ }
正しい:if (abs (value - 36.0) < 0.0001) { /* ... */ }
これは、2 進浮動小数点の精度の問題です。1.2
は 1.2 よりわずかに小さいため、乗算の結果は 36 よりわずかに小さくなります。
表現のため:1.2は実際には1.1999999のようなものです
浮動小数点演算は不正確になる可能性があるround()
ため、より良い結果を得るには、整数にキャストする前に使用してください。
#include <math.h>
...
return (int)round(some_real_value);
浮動小数点演算で完全に正確な結果を期待しないでください。乗算結果は、たとえば、35 に丸められた 35.9999 になる場合があります。
短い w = 30; 1.2 * w を返します。
return ステートメントでは、1.2 は double 型であるため、最初の並べ替え値は double にキャストされた型であるため、1.2 * 30.000000 を乗算し、結果は約 35.999999 になり、関数の戻り値の型は int であるため、小数部は切り捨てられ、35 のみが返されます。