C言語初心者です。
解の公式を求めるプログラムを作りたいのですが、根号の部分をどうすればいいのかわからなく、止まっています。
根号をどうやって計算させるのかがわかりません。
初歩的な質問ですいませんが、教えてください・・・
根号について
Re: 根号について
二分探索で求めることができます。
#include <stdio.h>
double getRoot(double target) {
double left,right,mid;
if(target<0)return -1;
left=0;right=(target<1?1:target);
while(1) {
mid=(left+right)/2;
if(mid*mid<=target) {
if(left==mid)break;
left=mid;
} else {
if(right==mid)break;
right=mid;
}
}
return mid;
}
int main(void) {
double input;
while(1) {
fprintf(stderr,"数を入力(負の数で終了):");
scanf("%lf",&input);
if(input<0)break;
printf("√%f==%.15f\n",input,getRoot(input));
}
return 0;
}複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
かずま
Re: 根号について
二分探索より、ニュートン法の方が終息が速いのと、
mathライブラリにはたくさんの関数があるということで。
mathライブラリにはたくさんの関数があるということで。
#include <stdio.h>
#include <math.h> // fabs, sqrt, pow, exp, log
double sqrt_newton(double a)
{
double x = 1, d;
if (a <= 0) return a;
do {
d = (x - a / x) * 0.5;
x -= d;
} while (fabs(d / x) > 1e-15);
return x;
}
int main(void)
{
double a;
while (printf("> "), scanf("%lf", &a) == 1 && a >= 0)
printf("sqrt(%.15g): %.15g, %.15g, %.15g, %.15g\n",
a, sqrt_newton(a), sqrt(a), pow(a, 0.5), exp(log(a)/2));
return 0;
}