標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第552回]

●SID、COD

ここ何回かZ80BASICの三角関数について説明をいたしました。
SIN()、COS()、TAN()です。
難しいことは存知ませんが三角関数はラジアンで計算するのが普通なのだそうですので、Z80BASICのSIN、COS、TANもラジアンで計算することになっています。
しかしシロートといたしましてはやっぱりラジアンはいまいちピンときませんです。
30度とか45度とか60度とか90度とかといえばすぐにあの三角定規が頭に浮かんできますけれど、それがπ/6だのπ/4だのといわれても全く何も頭に浮かびません。困ったものですけれど。

そこでZ80BASICでは度で計算するSID()とCOD()という関数も用意してあります。
度(Degree)で計算するSINですからSID()です。
そして度(Degree)で計算するCOSですからCOD()です。

SIDとCODはありますが、TADはありません。
TADはSID()/COD()で求められるからです。

前回までのところであるいはお気付きになられた方もみえるかと思います。
前回までの三角関数の例は、特殊角である、30度、45度、60度における計算例でした。
これは実は、ルート2=1.4142…、ルート3=1.732…を使って計算できてしまうのですよねえ。

まさか、SIN、COSったって、その前に紹介しましたSQR()を使って計算してるのではないだろうね?
30度と45度と60度の三角関数は計算できるけれど、そのほかの角度については、まだプログラムができておりませんので…なんてことは、ないだろうねえ?

ありませんよお。
前にも言いましたとおり、そんなハンパなものではありませんってば。

んでも、π/6とかπ/4ならまだなんとか理解の範疇ですけれど、そのほかの角度をラジアンで示してみたって、そりゃなんのこっちゃあ?
ということになってしまいます。

そこで、今回は三角関数をラジアンではなくて角度で計算させてみることにいたしました。
いつものようにログでお見せすることにいたします。

>list
    10 ON ERROR GOTO *ERR
    20 PRINT "degree","sin","cos","tan"
    30 FOR A=0 TO 90 STEP 5
    40 S=SID(A):C=COD(A)
    50 PRINT A,S,C,S/C
    60 NEXT A
    70 STOP 
    80 *ERR
    90 PRINT "***"
   100 RESUME  NEXT 

今回も簡単なプログラムです。
FOR NEXT文を使って、0度から90度まで、5度きざみに計算をさせてみることにしました。
TANはSIN/COSで求めています。
さっそく実行してみましょう。

 >run
degree       sin          cos          tan
0            0            1            0
5            0.871557E-1  0.996195     0.874886E-1
10           0.173648     0.984808     0.176327
15           0.258819     0.965926     0.267949
20           0.34202      0.939693     0.36397
25           0.422618     0.906308     0.466307
30           0.5          0.866025     0.57735
35           0.573576     0.819152     0.700207
40           0.642787     0.766044     0.839099
45           0.707107     0.707107     1
50           0.766044     0.642788     1.19175
55           0.819152     0.573577     1.42815
60           0.866025     0.5          1.73205
65           0.906308     0.422618     2.14451
70           0.939692     0.34202      2.74748
75           0.965926     0.258819     3.73205
80           0.984808     0.173648     5.67128
85           0.996194     0.871559E-1  11.43
90           1            0            ***

break in 70

実際のところ、こうやって計算させてみても、30度、45度、60度以外の角度のときの値には全く馴染みがないことには変わりはないのですけれど、それでもラジアンではなくて、度できざんでみますと、なんとなく納得できてしまうような気になります。
え?なりませんか?

うむむ。
たしかに。
これで、正しい結果が得られているのかどうかは。
わかりませんですねえ。

その確認につきましては、もう少しお待ちいただくことといたしまして。
今回も。
やっぱりい。
倍精度実数演算の登場ですよお。

前回もちょいと説明しました通り倍精度実数演算では、表示桁数が多いので、普通にPRINT文で表示しますと縦がまっすぐに通りません。
そこで、ちょいと即席、簡易的便宜的レイアウトを使うことにいたします。

>list
    10 ON ERROR GOTO *ERR
    20 PRINT "degree  sin"," ","cos"," ","tan"
    30 FOR A#=0 TO 90 STEP 5
    40 S#=SID(A#):C#=COD(A#)
    50 PRINT \2;A#;"  ";
    60 IF A#=0 PRINT S#," ",C#," ",S#/C#:GOTO 110
    70 IF A#=30 PRINT S#," ",C#,S#/C#:GOTO 110
    80 IF A#=60 PRINT S#,C#," ",S#/C#:GOTO 110
    90 IF A#=90 PRINT S#," ",C#," ",S#/C#:GOTO 110
   100 PRINT S#,C#,S#/C#
   110 NEXT A#
   120 STOP 
   130 *ERR
   140 PRINT "***"
   150 RESUME  NEXT 

PRINT文の中で、 ;(セミコロン)を使うと間を詰めて表示が行われます。
 ,(カンマ)を使うとタブ表示(13文字ごと)が行われます。
また、行番号50のようにPRINT文の中で¥に続けて数値をつけて示すと、固定表示桁の指定になります。以後の表示がその数以下の表示桁だった場合、足りない桁数分のスペースが追加されて縦が揃えられます。
実行結果でご確認ください。

>run
degree  sin               cos                       tan
 0  0                     1                         0
 5  0.8715574274765816D-1 0.9961946980917456        0.8748866352592399D-1
10  0.1736481776669303    0.9848077530122081        0.176326980708465
15  0.2588190451025207    0.9659258262890682        0.2679491924311227
20  0.3420201433256687    0.9396926207859083        0.3639702342662023
25  0.4226182617406994    0.90630778703665          0.4663076581549985
30  0.5                   0.8660254037844386        0.5773502691896257
35  0.5735764363510461    0.8191520442889918        0.7002075382097097
40  0.6427876096865393    0.766044443118978         0.8390996311772799
45  0.7071067811865475    0.7071067811865474        1
50  0.766044443118978     0.6427876096865393        1.19175359259421
55  0.8191520442889917    0.5735764363510461        1.428148006742115
60  0.8660254037844386    0.5                       1.732050807568877
65  0.90630778703665      0.4226182617406994        2.144506920509559
70  0.9396926207859083    0.3420201433256688        2.747477419454622
75  0.9659258262890682    0.2588190451025208        3.732050807568877
80  0.984807753012208     0.1736481776669303        5.671281819617712
85  0.9961946980917455    0.8715574274765818D-1     11.43005230276134
90  1                     0                         ***

break in 120

さて、この結果の数値なのですが、どの程度正確に計算されているのか、確認してみたい、とはお思いになりませんでしょうか?
じつは、かく言う、私自身が、こうやって皆様にお見せしたものの、一体どの程度正確な数値なのか気になってしまいました。
でも、ひとつひとつ関数電卓で計算して確かめるっていうのもねえ…。

そこで、調べてみましたら、excelにも三角関数があるんだそうですねえ。
知りませんでした。
それならば、ということで、excelでも計算してみました。

degree	radian		sin		   	cos			tan
0	0		0.0000000000000000 	1.0000000000000000 	0.0000000000000000 
5	0.087266463	0.0871557427476582 	0.9961946980917460 	0.0874886635259240 
10	0.174532925	0.1736481776669300 	0.9848077530122080 	0.1763269807084650 
15	0.261799388	0.2588190451025210 	0.9659258262890680 	0.2679491924311230 
20	0.34906585	0.3420201433256690 	0.9396926207859080 	0.3639702342662020 
25	0.436332313	0.4226182617406990 	0.9063077870366500 	0.4663076581549990 
30	0.523598776	0.5000000000000000 	0.8660254037844390 	0.5773502691896260 
35	0.610865238	0.5735764363510460 	0.8191520442889920 	0.7002075382097100 
40	0.698131701	0.6427876096865390 	0.7660444431189780 	0.8390996311772800 
45	0.785398163	0.7071067811865470 	0.7071067811865480 	1.0000000000000000 
50	0.872664626	0.7660444431189780 	0.6427876096865390 	1.1917535925942100 
55	0.959931089	0.8191520442889920 	0.5735764363510460 	1.4281480067421100 
60	1.047197551	0.8660254037844390 	0.5000000000000000 	1.7320508075688800 
65	1.134464014	0.9063077870366500 	0.4226182617406990 	2.1445069205095600 
70	1.221730476	0.9396926207859080 	0.3420201433256690 	2.7474774194546200 
75	1.308996939	0.9659258262890680 	0.2588190451025210 	3.7320508075688800 
80	1.396263402	0.9848077530122080 	0.1736481776669300 	5.6712818196177100 
85	1.483529864	0.9961946980917460 	0.0871557427476581 	11.4300523027613000 
90	1.570796327	1.0000000000000000 	0.0000000000000001     16324552277619100.0000000000000000 

excelでも三角関数はラジアンで計算しますが、度をラジアンに変換するradians()という関数があるということがわかりましたので、それを使って、角度をラジアンに変換してからsin、cos、tanを求めました。
セルの桁数表示を小数16桁に指定してみましたが、どうやらexcelの実数計算は有効桁数が15桁のようです。
むむ。おや、90度では、計算誤差が出ていますねえ。

こうやって、結果を比較してみますと。
おお。
ぴったりではありませんか。
なんだか、うれしくなってしまいますねえ。
2010.7.14upload

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