標準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
行番号だけを入力すると、その行は削除されます。
行番号10のPRINT文を削除しました。
次の行番号5の行は前回も説明しましたように、ログで見ると、ここでこの一行の文をキーボードから入力したように見えますが、実際にこの一行を入力したのではなくて、スクリーンエディタの機能を利用して、行番号5の行が表示されているところまで カーソルを移動して、そこで ’ だけを削除してから、[Enter]キーを入力したのです。
DOSプロンプト画面で表示されているどの行でも、そこにカーソルを持っていって[Enter]キーを押すと、その表示されている行がキーボードから入力されたのと同じことになります。
>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

前へ
次へ
ホームページトップへ戻る