標準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
前へ
次へ
ホームページトップへ戻る