C 语言中哪一个实现 L1 范数最快?
float x = fabsf(-3.0f);
或
float x = -1.0f * (-3.0f);
?
两者都返回数字
x = 3
取决于所使用的库。
有些使用 x86 指令“fabs”,如 Apple 的 fabfs 实现:
#define __FABSF(x) \
({ \
float __value, __arg = (x); \
asm volatile ("fabs %0,%1" : "=f" (__value): "f" (__arg)); \
__value; \
})
只需使用位掩码清除负位,如
float fabsf(const float x) _MATH_REENTRANT
{
FS_STATIC union float_long fl;
fl.f = x;
fl.l &= 0x7fffffff;
return fl.f;
}
{
/* Load the value as uint */
unsigned int u32 = *(unsigned int*)&x;
/* Clear the sign bit */
u32 &= ~(1 << 31);
/* Check for NAN */
if (u32 > 0x7F800000)
{
/* Set error bit */
*(unsigned int*)&x |= 0x00400000;
return x;
}
/* Convert back to float */
return *(float*)&u32;
}
毫无疑问有些乘以-1。
所以你必须编写自己的基准并告诉我们!