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 回答