私は整数XYとZを持っています
float[][] 配列を設定するために使用しているこの式があります
式は x/(y*(x+z) で、3 つすべてが整数です。
しかし、計算すると値は 0 です。これは、xy と z の値を確認したときとは異なります。
これを防ぎ、代わりに float 値を表示するにはどうすればよいですか?
よろしくお願いします
私は整数XYとZを持っています
float[][] 配列を設定するために使用しているこの式があります
式は x/(y*(x+z) で、3 つすべてが整数です。
しかし、計算すると値は 0 です。これは、xy と z の値を確認したときとは異なります。
これを防ぎ、代わりに float 値を表示するにはどうすればよいですか?
よろしくお願いします
整数 (または最初の整数) を float にキャストする必要があります。
float result = ((float)x)/(y*(x+z));
これにより、/
オペレーターは操作からフロートを生成します。
ゼロで除算していないことを確認することを忘れないでください。
私はあなたがこのようなことをしていると仮定します:
floats[i][j] = x / (y * (x + z));
問題は、RHS での計算が整数演算を使用して行われることです...すべての値が整数であるためです。特に、除算は整数除算です。つまり、(たとえば) の場合0 <= x < (y * (x + z)
、式はほとんどゼロに評価されます。
解決策は、浮動小数点演算を使用して強制的に除算を実行することです。
問題の 2 番目の側面は、整数オーバーフローのリスクがあることです。特に、y * (x + z)
1 つ以上の入力が大きすぎる場合、部分式がオーバーフローする可能性があります。これにより、計算のその部分の値が大幅に不正確になります。
オーバーフローの問題の解決策は、最後の除算だけでなく、計算全体を強制的に浮動小数点で行うことです。例えば
floats[i][j] = x / (y * ((float) x + z));
最後に、結果を正確 (または可能な限り正確) にしたい場合は、おそらくdouble
の代わりにを使用する必要がありfloat
ます。の問題float
は、最大 24 ビットの精度を持つ数値のみを表すことです。これは、およそ 7 桁の 10 進数です。double
53 ビットの精度が得られるため、パフォーマンスやストレージが重要でない限り、が推奨されます。これは、およそ 14 桁の 10 進数です。
これを試して:
float a = x / (1.F * y * (x + z));