みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

√2を求める

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

√2を求める

投稿記事 by みけCAT » 12年前

自然対数の底を求めるときに使ったマクローリン展開で、√2を求めてみた。
f(x)=sqrt(x+1)とおくと、
[album]554[/album]
という式で√2が求められそうだとわかった。
そこで、実際にプログラムを組んでみる。

CODE:

#include 
#include 

int main(void) {
	double ans,now;
	int i;
	ans=1;now=1.0/2.0;
	for(i=1;i
#include 

int main(void) {
	double ans,now;
	int i;
	ans=1;now=1.0/2.0;
	for(i=1;i=10000-5) {
			printf("%5d %.15f %.15f\n",i,ans,now);
		} else if(i==11)puts("中略"); 
		now*=-(2*i-1);
		now/=2*i+2;
	}
	printf("sqrt(2)=%.15f\n",sqrt(2));
	return 0;
}
実行すると

CODE:

    1 1.500000000000000 0.500000000000000
    2 1.375000000000000 -0.125000000000000
    3 1.437500000000000 0.062500000000000
    4 1.398437500000000 -0.039062500000000
    5 1.425781250000000 0.027343750000000
    6 1.405273437500000 -0.020507812500000
    7 1.421386718750000 0.016113281250000
    8 1.408294677734375 -0.013092041015625
    9 1.419204711914062 0.010910034179688
   10 1.409931182861328 -0.009273529052734
中略
 9995 1.414213703521030 0.000000282317088
 9996 1.414213421246307 -0.000000282274723
 9997 1.414213703478676 0.000000282232369
 9998 1.414213421288650 -0.000000282190026
 9999 1.414213703436343 0.000000282147693
10000 1.414213421330972 -0.000000282105371
sqrt(2)=1.414213562373095
10000項計算しても、小数点以下6桁までしか求まらなかった。
もう少し効率よく求まらないだろうか。

さっきのf(x)に、x=-1/2を代入してみると、f(x)=1/sqrt(2)となるので、これに2を掛ければ√2が得られる。
この時、
sqrt2_2.png
√2の求め方 その2
sqrt2_2.png (11.46 KiB) 閲覧数: 189 回
となる。
実際にやってみた。

CODE:

#include 
#include 

int main(void) {
	double ans,now;
	int i;
	ans=1;now=1.0/4.0;
	for(i=1;i
#include 

int main(void) {
	double ans,now;
	int i;
	ans=1;now=1.0/100.0;
	for(i=1;i
#include 

int main(void) {
	double ans,now;
	int i;
	ans=1;now=1.0/65918162.0/2.0;
	for(i=1;i<=100;i++) {
		ans-=now;
		printf("%3d %.15f %.15f\n",i,ans*2.0*5741.0/8119.0,now);
		now*=2*i-1;
		now/=65918162.0*(2*i+2);
	}
	printf("sqrt(2)=%.15f\n",sqrt(2));
	return 0;
}
実行結果は

CODE:

  1 1.414213562373095 0.000000007585163
  2 1.414213562373095 0.000000000000000
  3 1.414213562373095 0.000000000000000
  4 1.414213562373095 0.000000000000000
  5 1.414213562373095 0.000000000000000
中略
100 1.414213562373095 0.000000000000000
sqrt(2)=1.414213562373095
となり、なんとわずか2回の計算で小数点以下15桁まで求められた。
この数字を用いて多倍長計算したところ、100万桁の√2の値を、自分の環境で12分15秒で求められた。
円周率計算で約13万桁に4分20秒かかったことを考えると、比較的速いと言えるのではないか。
そんなことはない
多倍長電卓LMを用いて√2を100万桁計算してみる。
設定から10進桁数を1000010桁にして、sqrt(2)[Enter]
応答なし
ズラーッ
気になるタイムは・・・
23秒
は・・・速い・・・
[album]555[/album]
添付ファイル

[拡張子 zip は無効化されているため、表示できません]

sqrt2_3.png
√2の求め方 その3
sqrt2_3.png (12.63 KiB) 閲覧数: 182 回

コメントはまだありません。