高精度整数开根号算法
2012-02-14 11:52
148 查看
//高精度整数开根号算法
//假设被开方数为y(16位),而开方结果为x(8位),并且表示为一下格式:(32位开方类似)
//y = a15*2^15 + a14*2^14 +...+ a1*2^1 + a0*2^0;
//x = b7*2^7 + b6*2^6 + ... + b1*2^1 + b0^0;
unsigned int sqrt_int(unsigned int y)
{
unsigned int x,i,cmp,m,n,r,tmp;
x=0; //初始化根为0
r=y; //初始化余数为被开方数
m=r>>14; //初始化m = a31*2 + a30;
n=14; //初始化 n = 16 - 2*n;
if (m>=1) //确定根的最高位
{
x=1;
r=y-(x<<n);
}
for (i=0;i<7;i++)
{
n-=2; //32 - 2*n (n=2,3,4...)
x=x<<1;
cmp=((x<<1)+1)<<n; //递推公式
if(r>=cmp) //确定根在此位上为0还是1
{
x++; //根在此位上为1
r=r-cmp; //更新余数
}
}
return x;
}
//假设被开方数为y(16位),而开方结果为x(8位),并且表示为一下格式:(32位开方类似)
//y = a15*2^15 + a14*2^14 +...+ a1*2^1 + a0*2^0;
//x = b7*2^7 + b6*2^6 + ... + b1*2^1 + b0^0;
unsigned int sqrt_int(unsigned int y)
{
unsigned int x,i,cmp,m,n,r,tmp;
x=0; //初始化根为0
r=y; //初始化余数为被开方数
m=r>>14; //初始化m = a31*2 + a30;
n=14; //初始化 n = 16 - 2*n;
if (m>=1) //确定根的最高位
{
x=1;
r=y-(x<<n);
}
for (i=0;i<7;i++)
{
n-=2; //32 - 2*n (n=2,3,4...)
x=x<<1;
cmp=((x<<1)+1)<<n; //递推公式
if(r>=cmp) //确定根在此位上为0还是1
{
x++; //根在此位上为1
r=r-cmp; //更新余数
}
}
return x;
}
相关文章推荐
- 完整整数高精度算法系统
- 机试算法讲解:第29题 我也能做高精度整数的加法器,噢耶
- 实用算法实现-第 24 篇 高精度整数运算
- 实用算法实现-第 24 篇 高精度整数运算
- [算法设计与分析]3.2.4大整数存储及运算(高精度*长整数+n!)
- 正整数转成字符串 简单算法
- Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数
- 大数运算(超长整数运算)算法的简单分析
- 整数的素数分解算法
- 如何在手机上实现高精度及自适应多种场景的计步器算法
- 整数划分算法原理与实现
- 【Java】给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算
- 【LeetCode-面试算法经典-Java实现】【007-Reverse Integer(翻转整数)】
- 每天学习一算法系列(4) (输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和)
- 【CodeVS 3123】 高精度练习之超大整数乘法
- 链家笔试题--java实现两个大整数相乘的算法
- 3123 高精度练习之超大整数乘法 - Wikioi
- 简单算法 - 交换两个整数的三种方法
- 算法06:大整数乘法分治算法——分治法Part2