高效率开平方算法

 1 UINT sqrt(long m)
 2 {
 3
 4     BYTE i,j;
 5     UINT z,temp0,temp1;
 6     long x,y;
 7     x = 1;
 8
 9     for(j =0;j<16;j++)
10     {
11         x <<= 2;
12         if(m<x)
13             break;
14     }
15     x = y =1;
16     x <<=2*j;
17     y = x<<1;
18
19     z = 0;
20     temp0 = 0;
21     for(i=0;i<=j;i++)
22     {
23         z <<= 1;
24         temp0 <<= 2;
25         if(m&x)
26             temp0++;
27         if(m&y)
28             temp0 += 0x02;
29         m <<= 2;
30         temp1  = z;
31         temp1 = (temp1<<1) + 1;
32         if(temp1<=temp0)
33         {
34             temp0 -=temp1;
35             z++;
36         }
37     }
38
39     return z;
40
41 }

算法原理不是很清楚,但确实管用,开平方的值只精确到个位,误差最大为1。哪位大神明白的给指点下。

高效率开平方算法

时间: 2024-07-30 19:09:39

高效率开平方算法的相关文章

利用移位、加减法实现整数开平方算法的方法(转)

利用移位.加减法实现整数开平方算法的方法(转) 本算法只采用移位.加减法.判断和循环实现,因为它不需要浮点运算,也不需要乘除运算,因此可以很方便地运用到各种芯片上去. 我们先来看看10进制下是如何手工计算开方的.先看下面两个算式,x = 10*p + q  (1)公式(1)左右平方之后得:x^2 = 100*p^2 + 20pq + q^2 (2)现在假设我们知道x^2和p,希望求出q来,求出了q也就求出了x^2的开方x了.我们把公式(2)改写为如下格式:q = (x^2 - 100*p^2)/

sqrt开平方算法的尝试,是的看了卡马克大叔的代码,我来试试用C#写个0x5f3759df和0x5f375a86跟System.Math.Sqrt到底哪个更强

今天笔试遇到一个代码题,要求写一个开平方算法,回来发现了雷神之锤里的一段神代码: 1 float Q_rsqrt( float number ) 2 { 3 long i; 4 float x2, y; 5 const float threehalfs = 1.5F; 6 x2 = number * 0.5F; 7 y = number; 8 i = * ( long * ) &y; // evil floating point bit level hacking 9 i = 0x5f3759d

(高效率排序算法三)堆排序

一.堆的介绍         动态效果图         堆有如下特点的二叉树: 1.他是完全的二叉树.也就是说,除了树的最后一层布需要时满的,其他的每一层从左到右都是满的.(如下图的完全二叉树跟不完全二叉树) 2.它常常用一个数组在实现.(如下图显示了堆它与数组之间的关系.堆在存储器中的表示是数组:堆只是概念上的表示.注意树是完全二叉树,并且所有的节点满足堆的条件) 3.堆中的每一个节点都满足堆的条件,也就是说每一个节点的值都大于或者等于这个节点的子节点的值(如上图) 二,堆的移除 1.只能移

(高效率排序算法二)快速排序

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 假设用户输入了如下数组: 下标 0 1 2 3 4 5 数据 6 2 7 3 8 9 创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(赋值为第一

(高效率排序算法一)并归排序

归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为二路归并. 归 并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1:否则将第二 个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直

平方根(sqrt)算法

最近听说开平方算法挺难写,自己思考一下确实这些库函数只是一直在用,但是很少去思考如何实现的,sqrt在排序中使用频率非常的高,所以就研究了一下.大概有三种实现方式. 一.用二分的方法 每次用中间数就试,如果大就到左区间选取中间数试,如果小就到右区间找中间数试,采用不断逼近的方式计算平方根,这种方式迭代次数有点多,且每次试验都要进行运算,效率不是很高,但是思路简单,巧妙的运用了二分的方法. #define eps 0.00000001 float SqrtByBisection(float n)

《逆袭大学》文摘——9.5 用算法和数学奠定专业基础

有不少读者给我来信,咨询的是关于数学和算法对学习计算机的意义.这样的话题,在我的专栏中很多文章里都提到过.在拙作<逆袭大学--传给IT学子正能量>中,在这方面写了不少文字,现将其中的9.5节全文摘录在此文中,以供参考. 更多话题,见<逆袭大学--传给IT学子正能量>全书目录. 9.5 用算法和数学奠定专业基础 一个程序设计的初学者,在刚刚开始学习时,会认为编程中语言是最重要的.没有语言,没有掌握好编程语言,写不出程序来.而后又知道熟练运用语言仅仅是学会了一种表达的方式而已,如同一个

谈谈算法的基本思想

David Berlinkshi说:有两种思想,象珠宝商放在天鹅绒上的宝石一样熠熠发光,一是微积分,另一个就是算法.如果说微积分及在其基础上建立的数学分析体系造就了现代科学,而算法则造就了现代世界. 算法是计算机科学的灵魂,更是每个程序员和软件工程师必需具有的核心知识.区分一个好的软件工程师和一个代码磨工(coder)的关键就在于看其是否能够分析并设计出高效率的算法.正如爱因斯坦所说的,并非所有能计算的东西都有价值.能计算的算法,也不一定是有价值的.除正确性外,算法的效率对一个程序而言至关重要.

js算法初窥02(排序算法02-归并、快速以及堆排序)

上一篇,我们讲述了一些简单的排序算法,其实说到底,在前端的职业生涯中,不涉及node.不涉及后台的情况下,我目前还真的没想到有哪些地方可以用到这些数据结构和算法,但是我在前面的文章也说过了.或许你用不到,但是,真的,如果你想要在前端领域有一个不错的发展.数据结构和算法一定是你的必修课.它不仅仅让你在处理问题的时候可以有一个思维底蕴,更重要的是,在遇到一些奇葩产品的时候,你可以和他PK到底!嗯,到底! 哈哈,开个小玩笑.咱们还是聊点有营养的.上一篇的算法比较简单,主内容就是循环,次内容就是比较.但