0

私は整数XYとZを持っています

float[][] 配列を設定するために使用しているこの式があります

式は x/(y*(x+z) で、3 つすべてが整数です。

しかし、計算すると値は 0 です。これは、xy と z の値を確認したときとは異なります。

これを防ぎ、代わりに float 値を表示するにはどうすればよいですか?

よろしくお願いします

4

3 に答える 3

2

整数 (または最初の整数) を float にキャストする必要があります。

float result = ((float)x)/(y*(x+z));

これにより、/オペレーターは操作からフロートを生成します。

ゼロで除算していないことを確認することを忘れないでください。

于 2012-10-13T09:32:24.190 に答える
0

私はあなたがこのようなことをしていると仮定します:

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 進数です。double53 ビットの精度が得られるため、パフォーマンスやストレージが重要でない限り、が推奨されます。これは、およそ 14 桁の 10 進数です。

于 2012-10-13T09:57:24.433 に答える
0

これを試して:

float a = x / (1.F * y * (x + z));
于 2012-10-13T09:58:51.663 に答える