C++ Div3、Sqrt 函数高性能实现(带汇编指令集)

文章探讨了在C++中使用特定的魔法数字(如0x5f375a86和0x5f3759df)实现浮点数平方根计算(floatSqrt)的方法,以及针对不同处理器架构(Intel和AT&T)优化的整数除以3(Div3)的代码示例。
摘要由CSDN通过智能技术生成

均采用魔法数字(Magic Number)实现,一个是经典求平方根函数所使用的魔法数字:0x5f375a86、0x5f3759df。

float Sqrt(float x) noexcept { /* 0x5f3759df */
    float xhalf = 0.5f * x;
    int32_t i = *(int32_t*)&x;
    i = 0x5f375a86 - (i >> 1);
    x = *(float*)&i;
    x = x * (1.5f - xhalf * x * x);
    return x;
}

unsigned int Div3(unsigned int i) noexcept {
    // AT&T:
    // movl    $2863311531, %edx
    // imulq   %rcx, %rdx
    // shrq    $33, %rdx

    // INTEL:
    // mov     edx, 2863311531
    // imul    rdx, rcx
    // shr     rdx, 33

    unsigned long long n = static_cast<long long>(i) * 2863311531;
    unsigned int r = static_cast<unsigned int>(n >> 33);
    return r;
}

unsigned long long Div3(unsigned long long i) noexcept {
    // INTEL:
    // mov     rax, -6148914691236517205; 
    // mul     rcx
    // shr     rdx, 1

    int64_t rax = -6148914691236517205;
    int64_t rdx = (rax * i) >> 1;
    return rdx;
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值