首页 > 编程语言 >平方根倒数快速算法

平方根倒数快速算法

时间:2023-11-14 19:57:42浏览次数:40  
标签:0000 log 23 浮点数 1111 算法 127 倒数 平方根

平方根是什么?

给定一个x,我想算x^(1/2),就是在算平方根
在计算机里最常见的算法是牛顿迭代法

牛顿迭代法

平方根倒数是什么?

给定一个x,我想算x^-(1/2),就是在算平方根的倒数

平时我们是如何计算的?

如果在纸上写,就是一步一步的算,先算平方根(一般就是查表法),再求倒数;
但是大部分的数是无法在表格上查找到的
所以,这个快速算法是非常高效的

怎么个快速法?

计算机中的浮点数

  1. 假设一个数是浮点数Y
    我们可能不太清楚,它在计算机是如何存储的,但是这就是这个算法的牛逼之处,所以我尽量让大伙明白
    eg:浮点数:00111111111000000000000000000000,我们要怎么看?
  2. 首先将浮点数分成这样0 0111 1111 1100 0000 0000 0000 0000 000
    其中第一位是符号位(0是正数,1是负数),再过来的八位数(科学记数法里的指数位),再过来23位(科学计数法的有效位数,有效位数就是指小数点前不能为0,且只能有1位,所以第一个位的范围就是1~9)

  1. 好,那么好,这个数是不是就是1100 0000 0000 0000 0000 000 *10^(0111 1111)呢?
    答案是,错误;这个E的范围其实是-127~128,因为我们知道,在指数上面的负号不是说数字是负数,而是指小数点前有几个零
    那个M也是错的,之前都说了他只有代表1~9之前的数,然后后面是小数点位数,怎么会是1111 1100 0000 0000 0000 0000 000
    我们考虑一下,如果我们用二进制的科学记数法去表示数,那么我们的有效位数是不是就变成了1.xxxxx
    xxxxx都是由0跟1组成的序列,那么好,其实M记录的就是xxxxx序列,
    所以其实是1.1100 0000 0000 0000 0000 000 * 2^(0111 1111 - 0111 1111)
    这里减0111 1111就是为了让E的范围是-127~128
    所以十进制为1.1100 0000 0000 0000 0000 000 * 2^(0111 1111 - 0111 1111)=1.75 * 2 ^ 0 = 1.75

我们可以得出一个公式Y = (1 + M / 2^23) * 2^(E - 127),这是一个十进制表示的公式,这里有疑问的同学可以自己去搜一下为什么是这个表达式
如果你不想搜,我可以给你一个方向,把这题搞明白就知道了----->“我有10个箱子,箱子需要放苹果,此时,我想用10个箱子去表示0~ 1000数量的苹果,请问这些箱子我要如何去放苹果才能用这些箱子表示0~1000之间任意数量的苹果”(答案:1 2 4 16 32 64 128 256 512这样子装就行)

对数

我们还得学一点点对数的知识

好嘞,看完,我们开始

  1. 给你一个y,你要算出y^-(1/2),我们假设a = y^-(1/2)log取2为底
    取对数log(a) = (-1/2)log(y),问题转到了计算机如何算一个log
  2. 用刚刚的公式:y = (1 + M / 2^23) * 2^(E - 127)得,
    log(a) = log(1 + M / 2^23) + (E-127)log(2) = log(1 + M / 2^23) + E - 127
    其中M / 2^23 很小,所以利用近似思想log(1 + M / 2^23) ≈ M / 2^23
    log(a) ≈ M / 2^23 + E - 127,这样就将log运算,转成了除法跟乘法了
    但是细心的同学们会发现这个形式跟浮点数的公式好像,可不可以转成浮点数的样子呢?
  3. (1/2^23)(M + (2^23) * E) - 127这个(2^23)相当于左移了23位,刚好跟浮点数的E对上,这里加减不能用浮点数运算去理解,得用整数运算理解,所以log(a) ≈ (1/2^23)* A - 127,A是a存储在计算机中的浮点数格式
    所以log(y)也是一样的,所以(-1/2)log(y) = (-1/2) * ((1/2^23)* Y - 127),Y是y存储在计算机中的浮点数格式
    得到等式:(1/2^23)* A - 127 = (-1/2) * ((1/2^23)* Y - 127)现在问题转变成了求解A是什么数
    A = 381 * (2^22) - (1/2) * Y,Y是y存储在计算机中的浮点数格式,381 * (2^22) = 5F400000
    所以A就是a存储在计算机中的浮点数格式,得到的就是一个y^-(1/2)近似解

总结:从开始的a = y^-(1/2),转成了计算机如何算一个log数,然后将log运算转成了线性运算,到最后问题转变成了求解A,A是a存储在计算机中的浮点数格式
注意:我这里忽略了符号位的计算
代码:

int ksqrt (float num) {
  float y;
  int a;
  y = num;
  int i = * (int *) &y; //将y转成int 类型运算
  int const_num = 0x5F400000; //这里可以改成0x5f3759df,答案更精确
  a = const_num - (i >> 1);//右移奇数,会少了小数
  y = * (int *) &a;//把a变回浮点数
  //一步牛顿迭代法就够了
  //牛顿迭代的步骤
  //xn+1 = xn - f(xn) / f'(xn)
  //f(x)如何构建?
  //y = a ^ -(1/2)
  //y^-(1/2) = a
  //y^-(1/2) - a = 0
  //构建一个f(y) = 1 / y^2 - a 
  //f(x) = 1/ x^2 - a
  y = 1.5*y - (num * 0.5) * y * y * y;
  return  y;
}

总结

这个思想最牛的地方就是将log运算转成了近似的线性运算,使得平方根倒数的求解变的简单,牛顿迭代如果最初点选择的好,就会使得运算大大减少,多思考多学习,勉励;

标签:0000,log,23,浮点数,1111,算法,127,倒数,平方根
From: https://www.cnblogs.com/luo-greenhand/p/17831818.html

相关文章

  • TSINGSEE视频汇聚管理与AI算法视频质量检测方案
    一、建设背景随着互联网视频技术的发展,视频监管在辅助安全生产、管理等方面发挥了不可替代的作用。但是,在监管场景中,仍然存在视频掉线、视频人为遮挡、视频录像存储时长不足等问题,对企业的日常管理和运转存在较大的安全隐患。企业原有视频运维系统存在检测准确率低、告警提醒滞后......
  • Java非对称加密RSA算法
    简介:公开密钥密码学(英语:Public-keycryptography)也称非对称式密码学(英语:Asymmetriccryptography)是密码学的一种算法。加密与解密使用不同的密钥,其中一个称之为公钥,对外公开,通常用于数据加密。另一个称之为私钥,是不能对外公布的,通常用于数据解密,这样使用公钥加密的数据即使被......
  • 视频质量AI检测算法与LiteCVR视频质量诊断方案介绍
    LiteCVR视频质量诊断方案可以实现对监控设备常见的异常抖动、画面条纹、画面模糊、偏色、亮度异常、对比度异常、冻结、丢失、噪声等机器故障及恶意遮挡、恶意变化监控场景的行为做出准确判断,还可以对监控设备因为网络异常等原因导致的设备断线、取流异常、码率是否达标等问题进行......
  • JVM之垃圾回收算法
    1.概述在JVM中,最大的亮点就是自动垃圾回收机制,那它是根据什么依据来判断是垃圾的呢,又是根据什么算法来回收垃圾的呢?不同的垃圾回收算法有不同的特点和应用场景,本文整理了JVM常见的几种垃圾回收算法,以及其优缺点和适用场景供读者参考。不熟悉JVM内存模型的可先参考如下这篇文章(......
  • Python冒泡排序算法
    冒泡排序算法是一种简单的排序算法,其基本思想是通过多次遍历数组,比较相邻的两个元素,如果它们的顺序不对则交换。这样一轮遍历之后,最大(或最小)的元素就会被移动到数组的最后,然后再对剩余的元素进行类似的操作,直到整个数组有序defbubble_sort(arr):n=len(arr)#外层循环控制遍历的......
  • 反向传播算法代码
    importtorchimporttorch.nnasnnimporttorch.optimasoptimclassMLPModel(nn.Module):def__init__(self,input_size):super(MLPModel,self).__init__()self.fc1=nn.Linear(input_size,128)self.fc2=nn.Linear(128,64)......
  • 11.14算法
    题目岛屿数量给你一个由 '1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[["1","1","1","1","0"],["1","1"......
  • DES对称加密算法Java实现
    DES对称加密算法Java实现源代码AESUtils.java//packageme.muphy.util;importjavax.crypto.*;importjavax.crypto.spec.SecretKeySpec;importjava.nio.charset.StandardCharsets;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmExcept......
  • 最小生成树求解算法-普利姆算法
    使用场景对于连通图从一点出发到达其他各点有很多条路径,但是我们要求最小生成树包含的点和边,最小生成树边=点-1;用途在于:求解一地到其他地点最短布线问题。要求:最小生成树(1)包含所有点(2)点点间只有一条通路相对于克鲁什卡尔算法,适用于稠密图,与边数无关。编码-输入图,minD......
  • 图的最小生成树算法设计
    二叉树设计实验名称:二叉树设计(1)实验目的:1)掌握二叉树的逻辑结构。2)掌握二叉树的二叉链表存储结构;3)掌握基于二叉链表存储的二叉树的遍历等操作的实现。(2)主要内容:1)定义二叉链存储结构。2)实现二叉树的建立(利用扩展先序序列建立二叉链表存储的二叉树)、二叉树的遍历、统计二叉树结点......