5

主に単精度浮動小数点数で動作するコードがあります。超越関数の呼び出しはかなり頻繁に発生します。現在、sin()、cos()、sqrt() などを使用しています。これは、 を受け入れて返す関数ですdouble。x87 用にのみコンパイルされている場合、単精度と倍精度に違いがないことがわかります。Agner Fog の最適化ガイドを読みましたが、SSE 命令を使用するこれらの関数のソフトウェア バージョンは、単精度浮動小数点数の方が高速です。

私の質問は、コンパイラが次のようなものに遭遇したときに、より高速な関数を自動的に使用するかどうかです。

float x = 1.23;
float y = sin(x);

それとも、丸め規則はそのような最適化を排除しますか?

検索して置換するだけで、パフォーマンスが向上するかどうかを確認するのは簡単です。問題は、これらの関数へのポインタも必要なことです。MSVC では、sinf()、cosf() などはインライン関数です。したがって、それらを使用するには少し体操が必要です。努力する前に、それが価値があるかどうかを知りたいです。

MSVC の他に、gcc もターゲットにしています。

4

1 に答える 1

3

を呼び出すときにキャストする必要はまったくありませんsin。実際<tgmath.h>、C99 に付属のヘッダーを使用すると逆効果になります。これにより、残念ながらターゲットの型ではなく、引数に従って適切な関数を選択する汎用マクロを入力できます。したがって、そのヘッダーを使用する場合 (これが MS で利用できるかどうかはわかりません)

float x = 1.23;
float y = sin(x);

sinfボンネットの下で自動的に使用されます。

于 2013-04-23T21:00:38.857 に答える