【发布时间】:2019-11-28 23:59:53
【问题描述】:
在 C99 的 x86-64 架构上获取标准 32 位浮点数的绝对值的最快方法是什么?内置函数 fabsf 和 fabs 不够快。我目前的做法有点绕:
unsigned int tmp = *((unsigned int *)&f) & 0x7fffffff;
float abs = *((float *)&tmp);
它可以工作,但很难看。而且我不确定它是最佳的吗?
请不要再告诉我关于类型双关的指针,因为这不是我要问的。我知道代码可以使用联合来表达,但这并不重要,因为在所有编译器(过去 10 年编写的)上,它都会发出完全相同的代码。
【问题讨论】:
-
您不认为,如果有更快的方法可用,图书馆提供商会选择它吗?每秒有多少次你需要这样做而快得令人眼花缭乱的库例程无法管理?您可能还需要考虑您的方法可能不适用于“不常见”值的可能性,例如
NaN。我必须进行调查才能确定,但这可能是您需要考虑的事情。 -
你所做的确实打破了严格的别名,你应该使用无符号的位旋转,当然还有一个联合
-
类型双关语
float和unsigned违反C11 Standard - §6.5 Expressions (p6,7)“严格的别名规则”。 -
如果速度不够快,那么我相信你只能通过 SIMD 一次获取多个值的绝对值来加快速度
标签: c performance floating-point c99