次のコードの出力が0またはservenに等しいのはなぜですか?
cout << 7/9*9; //output 0 (zero) why?
float nine = 9;
float seven = 7;
float i = seven/nine*nine;
cout << i //output 7 Why?
助けてくれてありがとう。
次のコードの出力が0またはservenに等しいのはなぜですか?
cout << 7/9*9; //output 0 (zero) why?
float nine = 9;
float seven = 7;
float i = seven/nine*nine;
cout << i //output 7 Why?
助けてくれてありがとう。
7/9 * 9はこれらの数値を整数として評価するため、7/9は0と評価され、0 * 9=0と評価されます。
それらをフロートにしたとき、あなたは意図した計算を実行していました。
7.0 / 9 * 9を試して7を取得すると、浮動小数点演算が実行されます。
Cでは、整数を除算すると、余りは破棄されます。ここでは、7/9を実行し、その結果を取得して9を掛けています。段階的に、Cは次のように考えています。
7 / 9 = 0
0 * 9 = 0
フロートを使用すると、残りが破棄されなくなるため、正しく機能します。
の:
cout << 7 / 9 * 9;
あなたは整数演算をしています。したがって、7/9は0で、0*9は0です。
浮動小数点演算(2番目の例で使用しているもの)を使用するには、次のようにします。
cout << 7.0 / 9 * 9;
7/9*9
に等しい(7 / 9) * 9
が、7
および9
は整数であり、浮動小数点数ではないため、7 / 9
0(除算の商)に等しくなります。
精度の問題だと思います。/演算子と*演算子は同じ優先順位であるため、7/9 * 9は左から右に(7/9)*9として評価されます。キャッチは、整数演算では(7/9)が0であるということです。それらをfloatとして明示的に格納する場合、その/操作は浮動小数点で実行されます。これにより、intよりも高い精度で7/9を格納できます。
精度の問題なしに1行で計算を実行する場合は、次を試してください。
cout << 7.0f / 9.0f * 9.0f;
すでに多くの正解。追記: これを整数演算のままにし、浮動小数点を使用しない場合は、除算の前に乗算を行い、最も精度が高くなるように順序付けする必要があります (ただし、乗算中にオーバーフローが発生しない限り)。どちらがフロートに変換されるよりも(7.0/9)*9
、行うことができます(9*7)/9
。