標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第550回]
●SIN、COS、TAN(倍精度)その2
前回、単精度実数演算の三角関数サンプルプログラムを倍精度演算に直して実行してみましたら、ERR:9が表示されてしまいました。
文法に合わない式がある、というメッセージです。
というところでタイムアウトになってしまいました。
今回はその続きからです。
文法に合わない式がある、だけでは実際のところ何が悪いのか全くわかりません。
出来の悪いエラーメッセージの見本です。
見たところ、別に悪いところはなさそうに思えますが…。
30 A#=PI/6:A$="pai/6":GOSUB *SAN
この文はもとは下の単精度の式を倍精度に直したものです。
30 A=PI/6:A$="pai/6":GOSUB *SAN
どこを直したかといいますと、A=をA#=に直しただけなのですよねえ。
ああ。そうでした。
これはいけませんでした。
A#は倍精度変数ですけれどPIは単精度でした。
A#=PIでは、わざわざ倍精度変数を使う意味が無いじゃないの、つうことで、こういう場合はエラーになってしまいます。
ここは、PIではなくて、PI#を使うべき、でした。
で、前回と同様にして、今度はPIをPI#に変更します。
まずはSLコマンドで確認をしておいて…。
>sl pi 30 A#=PI/6:A$="pai/6":GOSUB *SAN 40 A#=PI/4:A$="pai/4":GOSUB *SAN 50 A#=PI/3:A$="pai/3":GOSUB *SAN 60 A#=PI/2:A$="pai/2":GOSUB *SAN 70 A#=PI:A$="pai":GOSUB *SAN 80 A#=PI*1.5:A$="1.5pai":GOSUB *SAN 90 A#=PI*2:A$="2pai":GOSUB *SAN
それから、XLコマンドで一気に変更してしまいます。
>xl pi,pi# 30 A#=PI/6:A$="pai/6":GOSUB *SAN 40 A#=PI/4:A$="pai/4":GOSUB *SAN 50 A#=PI/3:A$="pai/3":GOSUB *SAN 60 A#=PI/2:A$="pai/2":GOSUB *SAN 70 A#=PI:A$="pai":GOSUB *SAN 80 A#=PI*1.5:A$="1.5pai":GOSUB *SAN 90 A#=PI*2:A$="2pai":GOSUB *SAN
うまく変更できたかどうかLISTコマンドで確かめてみましょう。
>list 5 'ON ERROR GOTO *ERR 10 PRINT "rad","sin","cos","tan" 20 A#=0:A$="0":GOSUB *SAN 30 A#=PI#/6:A$="pai/6":GOSUB *SAN 40 A#=PI#/4:A$="pai/4":GOSUB *SAN 50 A#=PI#/3:A$="pai/3":GOSUB *SAN 60 A#=PI#/2:A$="pai/2":GOSUB *SAN 70 A#=PI#:A$="pai":GOSUB *SAN 80 A#=PI#*1.5:A$="1.5pai":GOSUB *SAN 90 A#=PI#*2:A$="2pai":GOSUB *SAN 100 STOP 110 *SAN 120 PRINT A$,SIN(A#),COS(A#),TAN(A#) 130 RETURN 190 *ERR 200 PRINT "***" 210 RESUME NEXT
それではもう一度RUNコマンドで実行してみましょう。
>run rad sin cos tan 0 0 1 0 pai/6 0.5 0.8660254037844386 0.5773502691896257 pai/4 0.7071067811865475 0.7071067811865475 1 pai/3 0.8660254037844386 0.5 1.732050807568877 pai/2 1 0 ERR:51 120 PRINT A$,SIN(A#),COS(A#),TAN(A#)
あれ?
また、エラーです。
ああ。そうでした。
ON ERROR GOTO文をコメント行にしたままでした。
ERR:51は、関数内部で0除算が行われた、というエラーメッセージです。
90度のTANは計算できませんでした。
ついでにPRINT文も変更することにしました。
倍精度の数は桁数が多いため、単精度と同じように表示させると、縦がうまく揃ってくれません。
>120p. "rad=";a$ >121p."sin=";sin(a#) >122p."cos=";cos(a#) >123p."tan=";tan(a#) >124p.
前回も少し説明をしましたが、BASICの命令でも省略形が使えます。
print と入力する代わりに、p.と入力することができます。
>list 5 'ON ERROR GOTO *ERR 10 PRINT "rad","sin","cos","tan" 20 A#=0:A$="0":GOSUB *SAN 30 A#=PI#/6:A$="pai/6":GOSUB *SAN 40 A#=PI#/4:A$="pai/4":GOSUB *SAN 50 A#=PI#/3:A$="pai/3":GOSUB *SAN 60 A#=PI#/2:A$="pai/2":GOSUB *SAN 70 A#=PI#:A$="pai":GOSUB *SAN 80 A#=PI#*1.5:A$="1.5pai":GOSUB *SAN 90 A#=PI#*2:A$="2pai":GOSUB *SAN 100 STOP 110 *SAN 120 PRINT "rad=";A$ 121 PRINT "sin=";SIN(A#) 122 PRINT "cos=";COS(A#) 123 PRINT "tan=";TAN(A#) 124 PRINT 130 RETURN 190 *ERR 200 PRINT "***" 210 RESUME NEXTちゃんとPRINTに置き換わっています。
>10 > 5 ON ERROR GOTO *ERR行番号だけを入力すると、その行は削除されます。
>list 5 ON ERROR GOTO *ERR 20 A#=0:A$="0":GOSUB *SAN 30 A#=PI#/6:A$="pai/6":GOSUB *SAN 40 A#=PI#/4:A$="pai/4":GOSUB *SAN 50 A#=PI#/3:A$="pai/3":GOSUB *SAN 60 A#=PI#/2:A$="pai/2":GOSUB *SAN 70 A#=PI#:A$="pai":GOSUB *SAN 80 A#=PI#*1.5:A$="1.5pai":GOSUB *SAN 90 A#=PI#*2:A$="2pai":GOSUB *SAN 100 STOP 110 *SAN 120 PRINT "rad=";A$ 121 PRINT "sin=";SIN(A#) 122 PRINT "cos=";COS(A#) 123 PRINT "tan=";TAN(A#) 124 PRINT 130 RETURN 190 *ERR 200 PRINT "***" 210 RESUME NEXT >ren
●RENコマンド
LIST表示のあとで、RENコマンドを使いました。
renumberです。
最初は行番号が10番ごとだったのですが、行番号5、121〜124が追加され、行番号10が削除されて、ちょっと行番号が乱れていますから、ここで整理しておこう、というわけです。
あ。もちろん、このままでもプログラムの実行には全く支障はありません。
>list 10 ON ERROR GOTO *ERR 20 A#=0:A$="0":GOSUB *SAN 30 A#=PI#/6:A$="pai/6":GOSUB *SAN 40 A#=PI#/4:A$="pai/4":GOSUB *SAN 50 A#=PI#/3:A$="pai/3":GOSUB *SAN 60 A#=PI#/2:A$="pai/2":GOSUB *SAN 70 A#=PI#:A$="pai":GOSUB *SAN 80 A#=PI#*1.5:A$="1.5pai":GOSUB *SAN 90 A#=PI#*2:A$="2pai":GOSUB *SAN 100 STOP 110 *SAN 120 PRINT "rad=";A$ 130 PRINT "sin=";SIN(A#) 140 PRINT "cos=";COS(A#) 150 PRINT "tan=";TAN(A#) 160 PRINT 170 RETURN 180 *ERR 190 PRINT "***" 200 RESUME NEXT
行番号が付け直されました。
今回のサンプルプログラムではGOTO文やGOSUB文にラベルを使いましたが、ここに行番号が指定されている場合でも、renコマンドは有効です。
その場合にはGOTO文やGOSUB文で指定している行番号も正しく置き換えられます。
さて、いよいよ実行です。
>run rad=0 sin=0 cos=1 tan=0 rad=pai/6 sin=0.5 cos=0.8660254037844386 tan=0.5773502691896257 rad=pai/4 sin=0.7071067811865475 cos=0.7071067811865475 tan=1 rad=pai/3 sin=0.8660254037844386 cos=0.5 tan=1.732050807568877 rad=pai/2 sin=1 cos=0 tan=*** rad=pai sin=0 cos=-1 tan=0 rad=1.5pai sin=-1 cos=0 tan=*** rad=2pai sin=0 cos=1 tan=0 break in 100 >/exit ndremote.exeを終了しました logfile closed at Sun Jul 11 08:11:19 2010
おお。
今度は、うまくいきました。
2010.7.12upload
前へ
次へ
ホームページトップへ戻る