C++ Div3、Sqrt 函数高性能实现(带汇编指令集)
2023-12-13 08:02:47
均采用魔法数字(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;
}
文章来源:https://blog.csdn.net/liulilittle/article/details/134874910
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!