0

こんにちは、次のように定義された関数があります

int compareAB(float A, float B)  
{  
    if(A > B) 
    {  
        return 1;  
    }
    else if(A < B)
    {
        return -1;  
    }  
    else
    {
        return 0;
    }
}

上記の関数は、パフォーマンス ツールからわかるように、私のプロジェクトでの比較に時間がかかりすぎています。実行時間を改善できますか。

私が考える 1 つの方法は、2 つの数値の差を取り、それをゼロと比較することです。

ありがとう、

編集: この関数は、検索ツリーのデータ構造を維持するための並べ替え比較関数で使用されています。戻り値も修正されました。

4

3 に答える 3

5

これは、「浮動小数点で等値を比較してはならない」というルールを回避しようとする不自然な方法のように見えます。どちらの場合も暗黙的に浮動小数点精度に依存しているため、不等式の比較は等式の比較とそれほど違いはありません。最後の「else」ステートメントは、暗黙の A == B です。

通常のイディオムはif (::fabs(A - B) < e)、 e がある程度の許容範囲であるところですが、あなたの場合は . は必要ありません::fabs

正、負、および等しい場合に異なる結果が必要な場合 (計算精度の制限内)、次のようにします。

if (A - B > e){
    return 0;
} else if (A - B < -e){
    return 1;
} else {
    return -1;
}

期待できる最善の方法は、 e を に設定することstd::numeric_limits<double>::epsilon()です。実際の値は、A と B に到達するために実行される計算ステップの数に依存します。1e-08 はおそらく現実的です。

速度に関しては、残念ながらそれが現状です。これがボトルネックになったり、より速く実行されたりすることはわかりません。

于 2013-05-28T10:03:46.223 に答える
0

ここでの問題の 1 つは、戻り値が完全に正しくないことです。最初の戻り値は 1、2 番目の戻り値は -1、3 番目の戻り値は 0 でなければなりません。これを並べ替えに使用している場合、並べ替えはおそらく不安定であり、実行時間が長くなります。

a-bsを扱うつもりでない限り、原則として を返すだけでかまいませんNaN

于 2013-05-28T10:35:49.930 に答える