2

C# プログラムで速度の問題が発生しており、このパーセンテージ計算が原因で速度が低下していることを確認しました。計算は単純に n/d * 100 です。分子と分母の両方に任意の整数を指定できます。分子が分母よりも大きくなることはなく、負になることもありません。したがって、結果は常に 0 ~ 100 です。現在、これは単純に浮動小数点演算を使用して行われており、何千万回も計算されるため、多少遅くなります。0.1% 単位まで正確である必要はありません。そして、この計算値を使用して、固定定数値よりも大きいかどうかを確認します。すべてを整数として保持する必要があると考えているため、精度が 0.1 の範囲は 0 ~ 1000 になります。浮動小数点演算なしでこのパーセンテージを計算する方法はありますか?

計算で使用しているループは次のとおりです。

for (int i = 0; i < simulationList.Count; i++)
{
    for (int j = i + 1; j < simulationList.Count; j++)
    {
        int matches = GetMatchCount(simulationList[i], simulationList[j]);
        if ((float)matches / (float)simulationList[j].Catchments.Count > thresPercent)
        {
            simulationList[j].IsOverThreshold = true;
        }
    }
}
4

3 に答える 3

6

の代わりに、 (と仮定して)n/d > cを使用できます。 (は比較対象の定数値です。)n > d * cd > 0
c

この方法では、分割はまったく必要ありません。

ただし、オーバーフローには注意してください。

于 2010-04-11T00:51:03.183 に答える
0

書く代わりに

if ((float)matches / (float)simulationList[j].Catchments.Count > thresPercent)

これを書きます:

if (matches * theresPercent_Denominator > simulationList[j].Catchments.Count * thresPercent_Numerator)

このようにして、浮動小数点を取り除きます。

注:は有理数であれば ,thresPercentと表現できます。) PC ではこれが最適な方法だと思います。thresPercent_Numerator / theresPercent_Denominator他のプラットフォームでは、resPercent_Denominator および/または thresPercent_Numerator が 2 の累乗である場合、左シフトまたは右シフトによってさらに最適化できます。(通常は左シフトで十分ですが、オーバーフローを防ぐために、方程式を除算に再配置して右シフトを使用する必要がある場合があります)

于 2015-02-03T08:37:55.773 に答える
0

単位が 1 ではなく 10 分の 1 の場合、整数演算を使用して 0.1 の精度を得ることができます。

それ以外の:

for (...)
{
    float n = ...;
    float d = ...;

    if (n / d > 1.4) // greater than 140% ?

...次のようにします:

for (...)
{
    int n = 10 * ...;
    int d = ...;
    if (n / d > 14) // greater than 140% ?
于 2010-04-11T01:21:12.120 に答える