sinf(),cosf()和sin(),cos()之间有任何性能差异吗?

5
我有一些主要处理单精度浮点数的代码,经常调用超越函数。目前我使用接受和返回 double 的 sin()、cos()、sqrt() 等函数。当它被编译为 x87 时,我知道单精度和双精度之间没有区别。但是我在 Agner Fog 的优化指南中读到,使用 SSE 指令的软件版本的这些函数对于单精度浮点数更快。

我的问题是,当编译器遇到类似以下内容时,是否会自动使用更快的函数:

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

或者说舍入规则是否排除了这种优化?

只需要执行搜索和替换就可以轻松查看是否存在性能提升。问题是我还需要指向这些函数的指针。在MSVC中,sinf(),cosf()等都是内联函数。因此,使用它们需要一些技巧。在付出努力之前,我想知道是否值得。

除了MSVC,我还针对gcc进行定位。


1
你确定调用这些函数确实会导致减速并值得浪费时间去思考吗?你已经对你的代码进行了分析吗? - Michael Dorgan
1个回答

3

在调用sin函数时,实际上没有必要使用强制类型转换。事实上,如果您使用的是 C99 提供的 <tgmath.h> 头文件,则这样做可能会适得其反。该头文件提供了类型通用宏,根据参数选择正确的函数,但不幸的是,不能针对目标类型进行选择。因此,如果您使用该头文件(不确定 MS 是否可用),请注意。

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

在幕后,会自动使用sinf


你说得对。使用强制类型转换,编译器会认为输入确实是一个双精度浮点数。我已经从问题中将其删除了。 - cleong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接