sqrt函数的实现
原文: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函数的实现的更多相关文章
- 转:一个Sqrt函数引发的血案
转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html 源码下载地址:http://diducoder.com/sotr ...
- [转载]求平方根sqrt()函数的底层算法效率问题
我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...
- Sqrt函数高效实现
转自一个Sqrt函数引发的血案 我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来 ...
- 一个Sqrt函数引发的血案(转)
作者: 码农1946 来源: 博客园 发布时间: 2013-10-09 11:37 阅读: 4556 次 推荐: 41 原文链接 [收藏] 好吧,我承认我标题党了,不过既然你来了, ...
- 【转载】一个Sqrt函数引发的血案
转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/sotry-about-sqrt.html 源码下载地址:http://diducoder ...
- 一个Sqrt函数引发的血案
源码下载地址:http://diducoder.com/sotry-about-sqrt.html 好吧,我承认我标题党了,不过既然你来了,就认真看下去吧,保证你有收获. 我们平时经常会有一些数据运算 ...
- sqrt函数实现(神奇的算法)
我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...
- php sqrt()函数 语法
php sqrt()函数 语法 作用:sqrt()函数的作用是对参数进行求平方根 语法:sqrt(X) 参数: 参数 描述 X 进行求平方根的数字 说明:返回将参数X进行开平方后的结果江苏大理石平台 ...
- PHP sqrt() 函数
实例 返回不同数的平方根: <?phpecho(sqrt(0) . "<br>");echo(sqrt(1) . "<br>"); ...
- sqrt函数实现
感谢杨工,让我更加认识到自己技术薄弱,这道题源自于和杨工的非正式面试,当时根本没思路,甚至没和查找有丝毫的联系,看来做自己想做的还是要付出努力的.sqrt()即开平方运算,y=x*x,已知Y的情况下求 ...
随机推荐
- asp.net core中的razor页面
Razor 页面(Razor Pages)是 ASP.NET Core 2.0 中新增的一种Web页面模型,相对MVC形式更加简单易用,可以说是一个服务端的MVVM模型,本文简单的介绍一下它的用法. ...
- HDU 4768 Flyer (2013长春网络赛1010题,二分)
Flyer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- OFbiz--简单介绍
一.简单介绍 OFBiz是一个很著名的电子商务平台,是一个很著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构建大中型企业级.跨平台.跨数据库.跨应用server的多层.分布式电子商 ...
- Android adb logcat使用技巧
前言 新买的笔记本E431装了最新版的Eclipse,搞定了Android开发环境,可是logcat里查看东西居然仅仅显示level,没有错误的具体信息.我本身也不是一个愿意折腾图形界面,更喜欢纯命令 ...
- ASP.NET Web API实践系列01,以ASP.NET Web Form方式寄宿
创建一个空的ASP.NET Web Form项目. 右键项目,添加新项,创建Web API控制器类,TestController. 删除掉TestController默认的内容,编写如下: using ...
- delphi 取得任意程序的命令行
program GetCommandLineExDemo; uses Windows; constSystemHandleInformation = 16;ProcessBasicInformatio ...
- SpringBoot配置多数据源
原文:https://www.jianshu.com/p/033e0ebeb617 项目中用到了两个数据库,分别是Oracle和Mysql,涉及到了多数据源问题,这里做下记录 官方讲解:https:/ ...
- Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(2) 自己封装的Calendar接口
本章主要是收藏一些常用的类和接口,包括:万年历(农历.阳历节日.阴历节日).自定义的Calendar接口. 万年历 源码如下(ChineseCalendar.java): package com.vi ...
- Xcode 5中非常期待的6个功能
这里是新特征汇总博文链接:iOS7新特征汇总 小引: 自从北京时间2013年06月11日苹果发布Xcode 5 Developer Preview 1,到现在(2013年7约15日)已经过去一个月,苹 ...
- C#编程(四十七)----------集合接口和类型
原文链接: http://blog.csdn.net/shanyongxu/article/details/47005979 集合接口和类型 前面介绍了数组和Array类实现的接口.数组的大小是固定的 ...