C语言之美——平方根倒数快速计算

本文介绍了C语言中一种快速计算平方根倒数的算法,结合IEEE754标准,探讨了浮点数的表示方法,并通过位操作和C语言技巧实现了高效计算。文章详细解析了源码,揭示了算法背后的数学原理,特别是通过牛顿迭代法提高精度。
摘要由CSDN通过智能技术生成

C语言之美——平方根倒数快速计算

前言

由于特殊原因,陆陆续续接触陀螺仪很长一段时间,对于各种解析算法的运算速率有了切身体会,不断追求更快、更准。最近,发现了一份比较特殊的平方根倒数速算法,一下子来了兴趣,要知道,陀螺仪解析算法里,倒数可是很常见的啊。下面来看一看这一份优美的代码,足以体现C语言的独特美感。

源码

你看不懂就对了<( ̄ˇ ̄)/,不然谁听我下面的哔哔呢?

float rsqrt(float number)
{
    long i;                        //32-bit number
    float x2, y;                   //32-bit decimal number
    const float threehalfs = 1.5F; //1.5(also 32-bit)

    x2 = number * 0.5F;
    y = number;
    i = *(long *)&y;           // evil floating point bit hack
    i = 0x5f3759df - (i >> 1); //what the fuck?
    y = *(float *)&i;
    y = y * (threehalfs - (x2 * y * y)); //1st iteration
    //y = y * (threehalfs - (x2 * y * y)); // 2st iteration,can be remove

    return y;
}

IEEE754标准

定点数

定点数,自然是相对于浮点数而言的。
何为定点?何为浮点?

定点,通俗来说就是小数点位置是固定的。
官方一丢丢的解释(>▽<):

在定点数表达法中,其小数点固定地位于实数所有数字中间的某个位置。例如,货币的表达就可以采用这种表达方式,如 55.00 或者 00.55 可以用于表达具有 4 位精度,小数点后有两位的货币值。由于小数点位置固定,所以可以直接用 4 位数值来表达相应的数值。

但我们不难发现,定点数表达法的缺点就在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。因此,最终绝大多数现代的计算机系统都采纳了所谓的浮点数表达法。

浮点数

浮点,通俗来说就是小数点位置是浮动的。
官方一点的解释(o゜▽゜)o☆:

浮点数表达法采用了科学计数法来表达实数,即用一个有效数字。一个基数(Base)、一个指数(Exponent)以及一个表示正负的符号来表达实数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。

表示方法 (仅限于单精度浮点数)

在IEEE 754标准中浮点数由三部分组成:符号位(sign bit),有偏指数(biased exponent),小数(fraction)。浮点数分为两种,单精度浮点数(single precision)和双精度浮点数(double precision),它们两个所占的位数不同。

单精度浮点数(共32位):
1个符号位
8个指数位
23个小数位

先来看看下面的例子,简单阐述了浮点数的表示方法:

在简单知道了浮点数表示方法之后,一个有意思的事情又开始了:
我们知道了,浮点数的表示方法其实灵感来源于科学计数法,科学计数法表示的数如1.2×10²,数字的首位一定不为0,即不会出现0.2×10²的情况。于是,在二进制里相应的最高位一定也不会为0,只能为1。
研究754标准那帮人特牛,嗯~ o( ̄▽ ̄)o,直接把确定的1省去默认,23个小数位全为真·小数位(哈哈哈),简单来说,又省了一位确定的,将他分配给小数表示。

到现在,我们可以又下面的公式 (敲黑板(☄⊙ω⊙)☄)
( 1 + m 2 23 ) × 2 e − 127 \left ( {1+\frac {m} { {2}^{23}}} \right )\times {2}^{e-127} (1+223m)×2e127
其中m表示23位的小数部分,e表示8位的指数部分 由于指数有正负,所以减去127

下面我们跟着将浮点数公式取对数变换,最终得到:
l o g 2 ( 1 + m 2 23 ) + e − 127 {log}_{2}\left ( {1+\frac {m} { {2}^{23}}} \right )+e-127 log2(1+223m)+e127

然后咋办呢~ ( ̄▽ ̄) ~*?我们这样:
l o g 2 ( 1 + x ) ≈ x {log}_{2}\left ( {1+x} \right )\approx x

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十兮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值