主に単精度浮動小数点数で動作するコードがあります。超越関数の呼び出しはかなり頻繁に発生します。現在、sin()、cos()、sqrt() などを使用しています。これは、 を受け入れて返す関数ですdouble
。x87 用にのみコンパイルされている場合、単精度と倍精度に違いがないことがわかります。Agner Fog の最適化ガイドを読みましたが、SSE 命令を使用するこれらの関数のソフトウェア バージョンは、単精度浮動小数点数の方が高速です。
私の質問は、コンパイラが次のようなものに遭遇したときに、より高速な関数を自動的に使用するかどうかです。
float x = 1.23;
float y = sin(x);
それとも、丸め規則はそのような最適化を排除しますか?
検索して置換するだけで、パフォーマンスが向上するかどうかを確認するのは簡単です。問題は、これらの関数へのポインタも必要なことです。MSVC では、sinf()、cosf() などはインライン関数です。したがって、それらを使用するには少し体操が必要です。努力する前に、それが価値があるかどうかを知りたいです。
MSVC の他に、gcc もターゲットにしています。