標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第556回]
●ATN()関数
[第548回]から[第550回]で三角関数について説明をしましたが、もうひとつ紹介するのを忘れておりました。
ATN()関数です。
一般にarctanとかtan-1と表現します。アークタンジェント(逆正接)です。
普通の三角関数は角度(またはラジアン)を与えて、その角に対する値(三角比)を求めるものですが、tan-1はこれとは逆にtanによって求められた値から逆にもとの角を導き出すものです。
三角関数に対して逆三角関数といいます。
EXCELにはASIN()やACOS()もありますが、Z80BASICではtan-1だけがあります。sin-1やcos-1はありません。
tanの逆関数ですからTAN()と一緒に使ってみます。
>list
5 ON ERROR GOTO 70
10 FOR A=0 TO 90 STEP 5
20 T=SID(A)/COD(A)
30 RAT=ATN(T)
35 DAT=RAT/PI*180
40 PRINT A,T,DAT
50 NEXT A
55 PRINT "end"
60 STOP
70 PRINT A,"***","***"
80 RESUME 50
>run
0 0 0
5 0.874887E-1 5
10 0.176327 10
15 0.267949 15
20 0.36397 20
25 0.466308 25
30 0.57735 30
35 0.700207 35
40 0.839099 40
45 1 45
50 1.19175 50
55 1.42815 55
60 1.73205 60
65 2.14451 65
70 2.74748 70
75 3.73205 75
80 5.67128 80
85 11.43 85
90 *** ***
end
break in 60
プログラムについては少し説明が必要かもしれません。
FOR NEXTを使って0度〜90度の間のtanを5度きざみで求めるとともに、その求めた値をATN()関数に入れて、もとの度数を求める、ということをさせています。
ところがZ80BASICでは、TAN()関数はラジアンのみで度に対するtanはありません。
度をラジアンに直してからTAN()に与えてもよいのですが、ここではtan=sin/cosですから、度で計算するSID()とCOD()を使って、SID()/COD()を計算して、その度のときのtanを求めています。
ところで、ATN()も計算した結果はラジアンになります。
これは仕方がありませんから、180/πを掛けて度に変換しています。
90度のtanは計算できませんから、on error goto文で処理しています。
●renコマンド
renコマンド(renumber)は[第550回]で少し説明をしています。
行番号を付け直すコマンドです。
行番号は行の先頭に置かれていますが、それ以外にgoto文やresume文などでも使われています。
renコマンドはそのgoto文やresume文の行番号も正しく付け直します。
今回のサンプルプログラムはちょうどgoto文、resume文を使っていますから、renコマンドの参考例としてrenコマンドを使ってみました。
renコマンドでさきほどのプログラムの行番号が行の先頭の番号だけではなくて、goto文、resume文も含めて付け直されていることに注目してください。
>ren
>list
10 ON ERROR GOTO 100
20 FOR A=0 TO 90 STEP 5
30 T=SID(A)/COD(A)
40 RAT=ATN(T)
50 DAT=RAT/PI*180
60 PRINT A,T,DAT
70 NEXT A
80 PRINT "end"
90 STOP
100 PRINT A,"***","***"
110 RESUME 70
>run
0 0 0
5 0.874887E-1 5
10 0.176327 10
15 0.267949 15
20 0.36397 20
25 0.466308 25
30 0.57735 30
35 0.700207 35
40 0.839099 40
45 1 45
50 1.19175 50
55 1.42815 55
60 1.73205 60
65 2.14451 65
70 2.74748 70
75 3.73205 75
80 5.67128 80
85 11.43 85
90 *** ***
end
break in 90
●ATN()関数(倍精度)
さて、ではいつものように、上のサンプルプログラムも倍精度に直して計算をさせてみましょう。
>list
10 ON ERROR GOTO 100
20 FOR A#=0 TO 90 STEP 5
30 T#=SID(A#)/COD(A#)
40 RAT#=ATN(T#)
50 DAT#=RAT#/PI#*180
60 PRINT A#,T#,DAT#
70 NEXT A#
80 PRINT "end"
90 STOP
100 PRINT A#,"***","***"
110 RESUME 70
>run
0 0 0
5 0.8748866352592399D-1 5
10 0.176326980708465 10
15 0.2679491924311227 15
20 0.3639702342662023 20
25 0.4663076581549985 25
30 0.5773502691896257 30
35 0.7002075382097097 35
40 0.83909963117728 40
45 1 45
50 1.19175359259421 50
55 1.428148006742115 55
60 1.732050807568877 60
65 2.144506920509559 65
70 2.747477419454622 70
75 3.732050807568877 74.99999999999999
80 5.671281819617712 80
85 11.43005230276134 85
90 *** ***
end
break in 90
75度のところで誤差のためちょっとみっともない表示になってしまいました。
それと0、45、90度のときの表示が他の表示と揃っていません。
その2点を直して再実行してみました。
>list
10 ON ERROR GOTO 120
20 FOR A#=0 TO 90 STEP 5
30 T#=SID(A#)/COD(A#)
40 RAT#=ATN(T#)
50 DAT#=RAT#/PI#*180
60 IF (A#=0)+(A#=45)PRINT A#,T#," ",DAT#:GOTO 90
70 IF A#=75 PRINT A#,T#,DAT#+0.00000000000001:GOTO 90
80 PRINT A#,T#,DAT#
90 NEXT A#
100 PRINT "end"
110 STOP
120 PRINT A#,"***"," ","***"
130 RESUME 90
>run
0 0 0
5 0.8748866352592399D-1 5
10 0.176326980708465 10
15 0.2679491924311227 15
20 0.3639702342662023 20
25 0.4663076581549985 25
30 0.5773502691896257 30
35 0.7002075382097097 35
40 0.83909963117728 40
45 1 45
50 1.19175359259421 50
55 1.428148006742115 55
60 1.732050807568877 60
65 2.144506920509559 65
70 2.747477419454622 70
75 3.732050807568877 75
80 5.671281819617712 80
85 11.43005230276134 85
90 *** ***
end
break in 110
行番号60のIF文は条件式がORになっています。
Z80BASICのIF文では条件式のORは、行番号60のように、+記号を使って、
IF (A#=0)+(A#=45)
と表現します。
ANDの場合は、*記号を使って条件式をつなぎます。
IF (A=0)*(B<0)
のように使います。
行番号70では、DAT#+0.1D−13というように入力したのですが、リスト表示ルーチンが、上で表示されたように表示してしまいます。
間違いではありませんから、このままにしておくことにしますが、リスト表示ルーチンにちょいとクセがあるようです。
2010.7.18upload
前へ
次へ
ホームページトップへ戻る