Skip to content

Instantly share code, notes, and snippets.

@firedent
Last active December 30, 2016 11:37
Show Gist options
  • Save firedent/79af91fa9f285838bf804a7af45f9564 to your computer and use it in GitHub Desktop.
Save firedent/79af91fa9f285838bf804a7af45f9564 to your computer and use it in GitHub Desktop.
开平方函数的C语言实现
// Created by zscself on 2016/12/20.
#include <stdio.h>
double ssqrt(int v,double t){
double double_v = (double) v;
double mid,midd,midSubT,midAddT,low = 0, high = double_v;
while(1){
mid = (low + high)/2;
midd = mid * mid;
midSubT = mid - t;
midAddT = mid + t;
if( midd == v){
double_v = mid;
}else if( midd > v ){
if(midSubT * midSubT < v){
double_v = mid;
break;
}
high = high-t;
}else{
if(midAddT * midAddT > v){
double_v = mid;
break;
}
low = low+t;
}
}
return double_v;
}
int main(int argc, char *argv[]) {
printf("%.16f",ssqrt(50000, 0.0001));
return 0;
}
// Created by zscself on 2016/12/20.
#include <stdio.h>
double newton(double x,double a){
double fx = x*x - a;
double fxD = 2*x;
double f = x-fx/fxD;
return f;
}
double ssqrt(int v,double t){
double f,dv;
f = dv = (double) v;
while (1) {
dv = newton(dv,f);
if(dv * dv < f && (dv+t)*(dv+t)>f){
break;
}
if(dv * dv > f && (dv-t)*(dv-t)<f){
break;
}
}
return dv;
}
int main(int argc, char *argv[]) {
printf("%.16f",ssqrt(50000, 0.0001));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment