0

浮動小数点数double num_float = 5.0;と次の2つの条件がある場合。

if(num_float > 3)
{
    //...
}

if(num_float > 3.0)
{
    //...
}

Q:浮動小数点への変換のために前者の比較を実行するのが遅くなるでしょうか3、それとも実際にはまったく違いがないのでしょうか?

明らかに、時間遅延はせいぜい無視できると思いますが、while(1)ループで複雑になると、長期的にはかなりの時間が失われる可能性があります(実際に遅い場合)。

4

4 に答える 4

4

「as-if」ルールにより、コンパイラはコンパイル時にリテラルを浮動小数点値に変換できます。優れたコンパイラは、より良いコードが得られる場合にそうします。

コンパイラとターゲット プラットフォームについて質問に明確に答えるには、コンパイラが何を出力し、どのように実行するかを確認する必要があります。ただし、主流のコンパイラが 2 つの if ステートメントのいずれも可能な限り最も効率的なコードに変換しなかったとしたら、私は驚くでしょう。

于 2013-02-14T22:12:11.590 に答える
2

値が定数の場合、コンパイラはコンパイルの一部として定数を浮動小数点数に変換するため、違いはありません[コンパイラが「浮動小数点数と整数の比較」命令を使用することを決定しない限り]。

値が整数 VARIABLE の場合、整数値を浮動小数点に変換する追加の命令があります [コンパイラが「浮動小数点と整数の比較」命令を使用できない限り]。

プロセス全体にどれだけの時間が追加されるかは、プロセッサの種類、浮動小数点命令の動作方法などに大きく依存します。

パフォーマンスが本当に重要な場合と同様に、代替案を測定します。できれば複数の種類のハードウェア (たとえば、PC の場合は AMD と Intel プロセッサの両方) を使用し、どちらがより適切な選択であるかを決定します。そうしないと、自分のハードウェアではうまく動作するようにコードをチューニングしても、他のハードウェアではうまく動作しないことに気付くかもしれません。これは良い最適化ではありません - あなたが今までに実行した唯一のマシンがあなた自身のものでない限り.

于 2013-02-14T22:35:12.580 に答える
0

Q: 3 を浮動小数点数に変換するため、前者の比較を実行すると遅くなりますか、それとも実際にはまったく違いはありませんか?

A) 整数として指定してください。一部のチップには、実行時に整数と比較するための特別な命令がありますが、コンパイラが最適なものを選択するため、これは重要ではありません。ターゲット アーキテクチャによっては、コンパイル時に 3.0 に変換される場合があります。それ以外の場合は、intのままになります。ただし、具体的に 3 が必要なため、「3」を指定します。

明らかに、時間遅延はせいぜい無視できると想定していますが、while(1) ループで複合化すると、長期的にはかなりの時間が失われる可能性があると思います (実際に遅い場合)。

A) コンパイラは、そのようなコードに対して奇妙なことは何もしません。最適なものを選択するので、時間の遅れはありません。数値定数を使用すると、コンパイラは、同じ結果を生成する限り、見た目に関係なく、最善のことを自由に実行できます。ただし、このタイプの比較を while ループで複合することはまったく望ましくありません。代わりに、整数ループ カウンターを使用します。浮動小数点ループ カウンターは、はるかに遅くなります。フロートをループ カウンターとして使用する必要がある場合は、単一ポイントの 32 ビット データ型を優先し、できるだけ比較を少なくします。

たとえば、問題を複数のループに分割できます。

int x = 0;
float y = 0;
float finc = 0.1;
int total = 1000;
int num_times = total / finc;
num_times -= 2;// safety
// Run the loop in a safe zone using integer compares
while (x < num_times) {
  // Do stuff
  y += finc;
  x++;
}
// Now complete the loop using float compares
while (y < total) {
  y+= finc;
}

これにより、比較速度が大幅に向上します。

于 2013-02-14T22:23:23.020 に答える