• 締切済み

十進BASICでのsin(x)の近似のグラフ化について

十進BASICを使っています。 sin(x)=x-x^3/3!+x^5/5!-... について、グラフで確かめようと思いプログラミングしてみたんですが、3行目でt=36以上にするとグラフが描かれなくなってしまいます。 どこを直せばt>35でもグラフが描かれるようになるのか教えていただけないでしょうか。よろしくおねがいします。 LET w=30 LET s=0.1 LET t=30 DIM p1(t) DIM p2(t) SET WINDOW -w,w,-w,w SET POINT STYLE 1 DRAW AXES0 FOR n= 1 TO t LET p1(n)=(-1)^(n+1) LET p2(n)=2*n-1 NEXT n SET LINE COLOR 15 FOR x= -w TO w STEP s LET y=SIN(x) PLOT LINES: x,y; NEXT x PLOT LINES SET LINE COLOR 1 FOR x= -w TO w STEP s WHEN EXCEPTION IN LET y=0 FOR n= 1 TO t LET y=y+p1(n)*x^p2(n)/FACT(p2(n)) NEXT n PLOT LINES: x,y; USE PLOT LINES END WHEN NEXT x END

みんなの回答

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

> LET y=y+p1(n)*x^p2(n)/FACT(p2(n)) もしかすると、累乗と階乗を計算する方法に手を加えると よいかもしれません。 xを掛けて1で割る xを掛けて2で割る xを掛けて3で割る ...... xを掛けてp2(n)で割る という順序にしてみてはいかがでしょうか。

aniline
質問者

お礼

ご指摘いただいた通り LET y=y+p1(n)*x^p2(n)/FACT(p2(n)) を LET y0=1 FOR f=1 TO p2(n) LET y0=y0*x/f NEXT f LET y=y+p1(n)*y0 に換えたところ36以上でも正常に動作しました。 ありがとうございます。 今後の参考にさせて頂きたいので、なぜ最初に書かれていた状態だといけないのか教えていただけないでしょうか。

回答No.2

>FACT(453)でオーバーフローしましたので、 現象確認できました。 FOR I = 1 TO 500 PRINT FACT(I) NEXT I END 念のために確認俺は Windows XP Pro SP2上でこれを http://hp.vector.co.jp/authors/VA008683/setup.htm 動作させてみている。 I=453でエラーが出たときは 1000桁モード(10 1000って描いてあるアイコン)になっていて、俺の環境だと「1000桁モードではSIN関数が使えません」って言われます。 その左にある15桁(JIS)モード (「10」って書いてあるアイコン)だと SIN関数は使えるようになったけどI=70でエラーが出る #1000桁モードとJISモードについてはヘルプの「操作」から「オプションメニュー」を見てください (まぁ俺がこれを調べたときは「数値」-「数値」から一番下の「表示桁数を多く」で飛んだんだけど) #ちなみに、 t=35のときp2(35)=2*35-1=69で t=36のときp2(36)=2*36-1=71だ

aniline
質問者

お礼

LOOP計算前に1000桁モードに変更していたのを忘れてました。。 原因もNo.1さんの仰るとおりですね。 ご指摘ありがとうございました。

回答No.1

俺は十進BASICをやったことはないが、 ざっと見たところ、プログラム自体は間違ってなさそう。 勘だけど、 > FACT(p2(n)) がオーバーフローしたとか言うことはない? で、USE以下が実行されていると。 (USEが何に使われているか自信ないんで勘だけどね)

aniline
質問者

お礼

No.2さんの仰るとおり、こちらのミスでした。 すいません…。 ありがとうございました。

aniline
質問者

補足

DO~LOOPでオーバーフローするまで階乗の計算をした結果、FACT(453)でオーバーフローしましたので、その点では大丈夫かと思います。

関連するQ&A