ページ 11

根号について

Posted: 2012年8月20日(月) 22:46
by えんぴつ
C言語初心者です。
解の公式を求めるプログラムを作りたいのですが、根号の部分をどうすればいいのかわからなく、止まっています。
根号をどうやって計算させるのかがわかりません。

初歩的な質問ですいませんが、教えてください・・・

Re: 根号について

Posted: 2012年8月20日(月) 23:05
by jay
C言語の標準ライブラリの一つであるmath.hの中に便利な関数があったはずです

詳しくはこの辺を見るなりGoogle先生に聞いてみるなりしてください

Re: 根号について

Posted: 2012年8月21日(火) 08:45
by みけCAT
二分探索で求めることができます。

コード:

#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;
}

Re: 根号について

Posted: 2012年8月22日(水) 10:13
by かずま
二分探索より、ニュートン法の方が終息が速いのと、
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;
}

Re: 根号について

Posted: 2012年8月22日(水) 10:16
by かずま
かずま さんが書きました:二分探索より、ニュートン法の方が終息が速いのと、
「収束」の誤変換でした。
解が求まるまでのループの回数が少ないということです。