C 语言中哪一个最快:fabsf(-3) 或 (-1)*(-3)?

问题描述 投票:0回答:1

C 语言中哪一个实现 L1 范数最快?

float x = fabsf(-3.0f);

float x = -1.0f * (-3.0f);

两者都返回数字

x = 3

c optimization normalization
1个回答
1
投票

取决于所使用的库。

有些使用 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;
}

ReactOS

{
    /* 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。

所以你必须编写自己的基准并告诉我们!

© www.soinside.com 2019 - 2024. All rights reserved.