微软大神“玩”出新花样,求平均值代码还能这样写?( 三 )


unsignedsum;
autocarry = __builtin_add_overflow(a, b, &sum);
return_builtin_rotateright1throughcarry(sum, carry); // missing intrinsic!
# else
# errorUnsupported compiler.
# endif
}
对应arm-thumb2的clang 汇编代码如下:
// __clang__ with ARM-Thumb2
movs r2, #0; Prepare toreceive carry
adds r0, r0, r1 ; Calculate sum withflags
adcs r2, r2 ; r2 holds carry
lsrs r0, r0, #1; Shift sum right one position
lsls r1, r2, #31; Move carry tobit 31
adds r0, r1, r0 ; Combine
Quake3中“神”一样的代码
可以看到Raymond的博客先从一个简单问题入手 , 逐步提出问题并给出解决方案 , 是一篇阐述编程之道的上乘之作 , 接下来请允许笔者再推荐一下《Quake3》当中的神级代码 。
《Quake3》这款3D游戏当年可以在几十兆内存的环境下跑得飞起 , 和目前动辄要求几十G显存的所谓3A大作形成鲜明对比 , 而《Quake3》取得这种性价比奇迹的关键在于把代码写得像神创造的一样 。
《Quake3》最大的贡献莫过于提出使用平方根倒数速算法 , 并引入了0x5f3759df这样一个魔法数 , 目前这段代码的开源地址在:https://github.com/raspberrypi/quake3/blob/8d89a2a3c1707bf0f75b2ea26645b872e97c0b95/code/qcommon/q_math.c
如下:
floatQ_rsqrt( floatnumber )
{
floatint_tt;
floatx2, y;
constfloatthreehalfs = 1.5F;
x2 = number * 0.5F;
t.f = number;
t.i = 0x5f3759df- ( t.i >> 1); // what the fuck?
y = t.f;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
//y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
returny;
}
这个算法的输入是一个float类型的浮点数 , 首先将输入右移一次(除以2) , 并用十六进制“魔术数字”0x5f3759df减去右移之后的数字 , 这样即可得对输入的浮点数的平方根倒数的首次近似值;而后重新将其作为原来的浮点数 , 以牛顿迭代法迭代 , 目前来看迭代一次即可满足要求 , 这个算法避免了大量的浮点计算 , 比直接使用浮点数除法要快四倍 , 大幅提升了平方根倒数运算的效率 。
写在最后
写完本文之后笔者真是思绪万千 , 国外的很多技术讨论要不是由浅入深的编程之道 , 要不是直接碾压的神级代码 , 而这些方面都是我们所需要学习与提升的方面 , 希望本文也能让大家多一些思考 。
《 新程序员003 》正式上市 ,50余位技术专家共同创作 , 云原生和数字化的开发者们的一本技术精选图书 。 内容既有发展趋势及方法论结构 , 华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等30多家知名公司云原生和数字化一手实战经验!
? 微信支持聊天图片搜索;英伟达因终止收购ARM损失13.6亿美元;Type 4.6 RC发布|极客头条
?“开源和商业化不能形成对立!”
【微软大神“玩”出新花样,求平均值代码还能这样写?】? 曾被“霸凌”的两个孩子:电动汽车与分布式数据库

特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。