实现sqrt()开方运算
2015-03-08 20:21
281 查看
我们其实在初中的数学中已经用过了一种方法:二边逼近
在这里我们同样使用这种方法:二分法
设大约出了一个结果mid
那么num-p<mid*mid<num+p//这里我们取p是很小的值,因为它主要是用来控制精度的
1.若mid*mid>num+p那么就是mid大了,这时候我们取mid-=q;//
2.若mid*mid<num-p那么就是mid小了,取mid+=q;
上代码
#include<stdio.h>
#include<climits>
#include<algorithm>
#include<stack>
#include<iostream>
#include<cmath>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<string.h>
using namespace std;
double p=1.0e-7;//这个代表的是误差的范围
double q=1.0e-5;//这个是调节取值
double n;
double solve(double n)
{
double mid=n/2.0;//取中间值
while((mid*mid<n-p)||(mid*mid>n+p))//目标是n-p<mid*mid<n+p
{
if(mid*mid<n-p)//过小
{
mid+=q;
}
else mid-=q;
}
return mid;
}
int main(void)
{
while(cin>>n)
{
cout<<solve(n)<<endl;
}
return 0;
}
在这里我们同样使用这种方法:二分法
设大约出了一个结果mid
那么num-p<mid*mid<num+p//这里我们取p是很小的值,因为它主要是用来控制精度的
1.若mid*mid>num+p那么就是mid大了,这时候我们取mid-=q;//
2.若mid*mid<num-p那么就是mid小了,取mid+=q;
上代码
#include<stdio.h>
#include<climits>
#include<algorithm>
#include<stack>
#include<iostream>
#include<cmath>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<string.h>
using namespace std;
double p=1.0e-7;//这个代表的是误差的范围
double q=1.0e-5;//这个是调节取值
double n;
double solve(double n)
{
double mid=n/2.0;//取中间值
while((mid*mid<n-p)||(mid*mid>n+p))//目标是n-p<mid*mid<n+p
{
if(mid*mid<n-p)//过小
{
mid+=q;
}
else mid-=q;
}
return mid;
}
int main(void)
{
while(cin>>n)
{
cout<<solve(n)<<endl;
}
return 0;
}
相关文章推荐
- 每天一道LeetCode-----重新实现开方运算sqrt(x),只返回整数部分即可
- 巧用二分法实现数学开方(sqrt)运算
- 整数开方运算的DSP实现
- matlab中的开方sqrt用牛顿迭代法实现的代码
- 二分法实现数字的开方运算
- SICP中sqrt(开方)的实现(附C#实现)
- 开方运算的DSP实现
- 【Java BigInteger开方sqrt的实现】
- C++ -- sqrt实现(开方实现)
- 实现对行列式的运算
- 设计一个时间类Time, 包括时,分,秒等私有数据成员。要求实现时间的基本运算,一个时间加上另一个时间。。
- 基于逻辑运算的简单权限系统(实现) JS 版
- 基于逻辑运算的简单权限系统(原理,设计,实现) VBS 版
- 基于逻辑运算的简单权限系统(原理,设计,实现) VBS 版
- [Python]Python中实现一个时间(日期)型加几个月的运算
- C/C++用移位实现乘除法运算,提高运行效率
- RSA算法实现中的大数运算,看别人写的
- 编写一个类实现复数的运算
- 用简易Ajax框架实现"加减乘除"运算【原创】
- J2ME 2D小游戏入门之旅(四)加入子弹群,实现碰撞运算