- ベストアンサー
フォートラン(初級?)についての質問です。
はじめまして。 フォートラン初心者の者です。 y=2^xの式において、DO LOOPを使って yが99桁の数字になるxの最大値を求めたいのですが、どうもうまくいきません。 こんな感じで書いてみました。 ----------------------- Do i=0, 1000 A= 2**i IF (A > (10**10)) then STOP end if end do ----------------------- 独学なので、出来るだけ詳しく教えて頂けると幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
フォートランは30年前にやりました。 文法は古いです。 x=0 => y=1=2**0 X=1 => Y=2=2**1 X=2 => y=4=2**2 x=3 => y=8=2**3 ・・・ つまり f(x)=f(x-1)+f(x-1) y+y が次のyになります。 A= 2**i でなくて a=a+a がいいですね。 初期値は必要です。 x=0 y=1 99桁はどうしましょう? 99桁の数は倍精度でも正確には表せません。 今は知りません。 変数の型の定義 n=0 d=1. DO i=1,1000 n=n+1 d=d+d if (d>(10.**99) )then stop endif enddo 99ケタの数はxが360から363です。 こたえ363です(多分)。 stop のときnつまりxは1大きいので、1ひきましょう。
その他の回答 (3)
- minny-mama
- ベストアンサー率100% (1/1)
訂正と追加です。 yが99ケタはxが329から332です。 こたえ332 (精度で誤かもしれません。) ポイントは変数の型です。数字も型があります。 具体的には調べてください。 倍精度の数字の書き方は忘れました。 桁を調べる関数はありませんか?
- kyo-mogu
- ベストアンサー率22% (3398/15358)
フローチャート書いていますか? まず、どのように処理をしているのか理解していないとプログラムは正常に動きません。 随分昔に使って居たのですが、なんとなく違和感を感じるのですが。 それと実際にプログラムを実行する場合、変数を表示させるプログラムを入れます。画面上に並んでいく形でも良いでしょう。そこから推測する方法もあります。 数式は有っているか。条件は正しいか。 プログラムを打ち込むときに等式を逆にしているなどのミスもあります。変数の文字が間違っている。カウンターのスタートがずれているとか。 どうしてもうまくいかないのなら、最初から見直してみましょう。 元プログラマからでした。
お礼
ありがとうございました。 参考にさせて頂きます。
- Tacosan
- ベストアンサー率23% (3656/15482)
何がどう「うまくいかないのか」をきちんと書いてください. あと, プログラムを書くにも「こんな感じ」ではなく正確に書きましょう. 「99桁」なら 10^10 と比較してもしょうがないね.
お礼
ありがとうございました。
お礼
ご回答ありがとうございます。 ”A= 2**iでなくてa=a+aがいいですね。” が大きなヒントになりました。 とりあえずy=2^xのyの部分は見つけれました。 あとは多分大丈夫だと思います。 ありがとうございました。 (ちなみに新しいフォートランの文法だとこんな感じです。) -------------------------------------------------- Program aaa implicit none integer :: i, n, SIZE integer :: A(101), C(101), Carry(101) do i = 1, 101 A(i) = 0 C(i) = 0 Carry(i) = 0 end do A(101)=1 !The largest number of power of two that has 100 digits? DO WHILE (A(2) < 7) DO i = 101,1, -1 C(i) = A(i) + A(i) + Carry(i) If (C(i) >9) then C(i) = C(i) - 10 Carry(i-1) = 1 End If End do DO i=101,1,-1 A(i) = C(i) end do DO i=101,1,-1 C(i) = 0 Carry(i) = 0 end do end do !Size of the output? DO i=1, 100, 1 If (A(i)/=0) then SIZE = 101-i EXIT else SIZE = 1 End if End do WRITE (*,*) "The largest number of power of two that has 100 digits is", (A(i), i = 101-size, 100) end Program aaa