原文:http://blog.csdn.net/legend050709/article/details/39394381

sqrt算法实现:

(一)int sqrt1(int n);
求取整数x的平方根,向下取整;

(0)步骤:

1.先求出范围;然后排序
2.然后二分查找;

(1)方法一:O(n)

for(int i=0;i*i<n;i++);
i=i-1;

(2)方法二:二分查找,O(lgn)

1)范围已经确定,即0~n,并且0~n之间的数据有序;
2)二分查找:

int sqrt1(int n){
 int left=0;
 int right=n;
 int mid;
 int last;
 while(left<=right){//应该找出mid*mid<=n的最后一个数
  mid=(right-left)/2+left;

if(mid*mid<=n){//寻找最后一个数,所以不断压缩左边,即left=mid+1
   last=mid;
   left=mid+1;
  }else{
   right=mid-1;
  }
 }
return last;
}

(3)方法三:O(lg(2分之根号n))+lg(根号n)

1)先确定范围;O(lg(2分支根号n))

for(int i=n;i*i>n;i=i/2);
j=2*i;

循环结束时,i*i<=n<(2i)*(2i)即i^2<=n<4i^2
然后只需要在i~2i之间寻找一个最大的数k,是的k^2<=n。

2)二分查找:

int left=i,right=j;

while(left<=right){//应该找出mid*mid<=n的最后一个数
  mid=(right-left)/2+left;

if(mid*mid<=n){//寻找最后一个数,所以不断压缩左边,即left=mid+1
   last=mid;
   left=mid+1;
  }else{
   right=mid-1;
  }
 }
return last;

----------------------

(二)float sqrt(float x)库函数的实现:
(1)二分法:

const float eps=0.000001; // eps的值可能影响最后计算精度,甚至导致无限循环
// 二分法,注意区分x的取值区间
float SqrtByBisection(float x)
{
 if(x<0) // 负数
  return x;
 if(x<=eps) // 正数0
  return 0.0f;
 if(fabs(x-1)<=eps) // 正数1
  return 1.0f;
 float left, right;
 float mid;
 if(x>eps&&x<1.0f-eps) // (0,1)区间
 {
  left=x;
  right=1.0f;
 } 
 else
 {
  left=1.0f;
  right=x;
 }  
 while(right-left>eps) // (1,)区间
 {
  mid=(left+right)/2;
  if(mid*mid>x+eps)
   right=mid;
  else if(mid*mid<x-eps)
   left=mid;
  else
   return mid;
 } 
 return mid;
}

---
(2)牛顿迭代算法:

1)示例图如下:
图一,图二:

2)代码实现:

// 牛顿迭代法
const float eps=0.000001; // eps的值可能影响最后计算精度,甚至导致无限循环
float SqrtByNewton(float x)
{
 float val=x;
 float last;
 while(fabs(val-last)>eps)
 {
  last=val;
  val=(val+x/val)/2;
 }
 return val;
}

----

(3)性能最好:比标准库函数快4倍;(不需要理解,了解即可)

float InvSqrt(float x)
{
 float xhalf = 0.5f*x;
 int i = *(int*)&x; // get bits for floating VALUE 
 i = 0x5f375a86- (i>>1); // gives initial guess y0
 x = *(float*)&i; // convert bits BACK to float
 x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
 x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
 x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy

return 1/x;
}

sqrt函数的实现的更多相关文章

  1. 转:一个Sqrt函数引发的血案

    转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html 源码下载地址:http://diducoder.com/sotr ...

  2. [转载]求平方根sqrt()函数的底层算法效率问题

    我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...

  3. Sqrt函数高效实现

    转自一个Sqrt函数引发的血案 我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来 ...

  4. 一个Sqrt函数引发的血案(转)

    作者: 码农1946  来源: 博客园  发布时间: 2013-10-09 11:37  阅读: 4556 次  推荐: 41   原文链接   [收藏]   好吧,我承认我标题党了,不过既然你来了, ...

  5. 【转载】一个Sqrt函数引发的血案

    转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/sotry-about-sqrt.html 源码下载地址:http://diducoder ...

  6. 一个Sqrt函数引发的血案

    源码下载地址:http://diducoder.com/sotry-about-sqrt.html 好吧,我承认我标题党了,不过既然你来了,就认真看下去吧,保证你有收获. 我们平时经常会有一些数据运算 ...

  7. sqrt函数实现(神奇的算法)

    我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...

  8. php sqrt()函数 语法

    php sqrt()函数 语法 作用:sqrt()函数的作用是对参数进行求平方根 语法:sqrt(X) 参数: 参数 描述 X 进行求平方根的数字 说明:返回将参数X进行开平方后的结果江苏大理石平台 ...

  9. PHP sqrt() 函数

    实例 返回不同数的平方根: <?phpecho(sqrt(0) . "<br>");echo(sqrt(1) . "<br>"); ...

  10. sqrt函数实现

    感谢杨工,让我更加认识到自己技术薄弱,这道题源自于和杨工的非正式面试,当时根本没思路,甚至没和查找有丝毫的联系,看来做自己想做的还是要付出努力的.sqrt()即开平方运算,y=x*x,已知Y的情况下求 ...

随机推荐

  1. Spring Data JPA使用keywords关键字实现CAST函数

    对不起,经过几天几夜的使用的研究得出这种方式是无法实现的,在查询上的关键字只有这些: https://docs.spring.io/spring-data/jpa/docs/2.1.x/referen ...

  2. VMware安装MikroTik RouterOS chr

    简单步骤: 1.官网下载ova镜像 2.导入到vmware即可.

  3. ASP.NET Web API中实现版本的几种方式

    在ASP.NET Web API中,当我们的API发生改变,就涉及到版本问题了.如何实现API的版本呢? 1.通过路由设置版本 最简单的一种方式是通过路由设置,不同的路由,不同的版本,不同的contr ...

  4. JavaScript进阶系列07,鼠标事件

    鼠标事件有Keydown, Keyup, Keypress,但Keypress与Keydown和Keyup不同,如果按ctrl, shift, caps lock......等修饰键,不会触发Keyp ...

  5. java hash表

    当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值. 然后,该键经过哈希处理,所得到的散列码被用作存储在该表中值的索引. Hashtable定义了四个构造方法.第一个是默认构造方法: Hash ...

  6. Android组件化方案

    Android组件化项目地址:Android组件化项目AndroidModulePattern Android组件化之终极方案地址:http://blog.csdn.net/guiying712/ar ...

  7. 低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode

           这篇文章主要讲的是在低版本兼容的ActionBar中实现自定义的ActionProvider,ShareActionProvider的使用方法,如何实现分离式ActionBar,外加在分 ...

  8. Android 阴影,圆形的Button

    MainActivity.java package com.kale.gridlayout; import android.app.Activity; import android.graphics. ...

  9. 彻底理解Java的feature模式

    先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...

  10. glyphicons-halflings-regular.woff2:1 Failed to load resource: the server responded with a status of 404 (Not Found)解决Web部署 svg/woff/woff2字体 404错误

    问题:最近在IIS上部署web项目的时候,发现浏览器总是报找不到woff.woff2字体的错误.导致浏览器加载字体报404错误,白白消耗了100-200毫秒的加载时间. 原因:因为服务器IIS不认SV ...