MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!
[第41回]
●SIN関数の近似式
前回の続きです。
前回はSIT4とSIT3を十進数に変換しました。
SIT4は−0.6459636688…になりました。
SIT3は0.07968968115…になりました。
次のSIT2を計算しますと、
4C9332を十進数に変換して、5018418を得ます。
5018418/128/256/256=0.5982420444…になります。
SIT2は負数ですから負号が加わります。
指数部がF9ですから、さらにその計算も加えます。
指数部がF9(つまり−7)ですからそれは仮数部×2−7ということです。
ですから求める数は、−5018418/128/256/256/128=−0.004673765972…になります。
最後のSIT1を計算します。
4F6BDDを十進数に変換して、5204957を得ます。
5204957/128/256/256=0.6204792261…になります。
指数部がF4ですから、その計算も加えます。
指数部がF4(つまり−12)ですからそれは仮数部×2−12ということです。
ですから求める数は、5204957/128/256/256/4096=0.0001514841861…になります。
とにかくは十進数に直してみたのですけれど、この数値を見ていただけではやっぱり何もわかりません。
そこで今度は方向を変えて、プログラムのほうから攻めていくことにしました。
処理を簡単にするためにADMALというサブルーチンを重ねて使っています。
そこをほぐしていきますと、どうやら
(π/2)*X+SIT4*X3+SIT3*X5+SIT2*X7+SIT1*X9
という計算が見えてきました。
ええっ。
これってまさか、あれじゃあないの?
●テイラー級数?
インターネットで「三角関数の近似式」で検索しますと、テイラー級数とかマクローリン展開について書かれたサイトが多くみつかります。
SIN関数に限らず、その他の関数もテイラー級数(マクローリン展開)により求めることが可能です。
SIN関数の解をテイラー級数で求めますと下の式になります。
sin(x)=x−(1/3!)x3+(1/5!)x5−(1/7!)x7+(1/9!)x9…
xの単位はラジアンを用います。
度を用いるSID()の場合は度をラジアンに変換したのち、SIN()のプログラムにエントリします。
度=π/180ラジアンで換算できます。
うーん。
確かにこれで求まることには間違いはないのですけれど。
果たしてテーラー級数をそのまま使ったのかどうか、もうとにかくかすむほどの昔のことですから、記憶も定かではないのでありますが。
古い昔のノートをひっくり返して調べてみましたら、確かに上記のテイラー級数をメモしておりました。
しかし、値によっては誤差が大きくなって、次数を増やしてもなかなか誤差が小さくならない、というようなことを経験したような、かすかな記憶があるような…。
結局テイラー級数を使うのはあきらめたようにも思います。
そもそもさきほど計算しました定数は1/3!でも1/5!でも1/7!でも1/9!でもありません。
全くかけ離れています。
この定数はいったいどこから引っ張ってきたのか?
いったい何を根拠にプログラムを書いたのか?
ノートを見てもそのあたりのことは何も書いていないようでありました。
さて困った。
それでは説明のしようがないではないか。
苦し紛れに、上で説明しました根拠不明の数値を電卓でいろいろいじくっていましたら。
おおおっ。
なんだか少し見えてきたように思えました。
SIT4 −0.6459636688…は、
−(1/3!)*(π/2)3=−0.6459640975…
に近いじゃありませんか!
ま、少し違っていますけれど…。
そういうことならば、勇気を出して次もやってみるべし、であります。
SIT3 0.07968968115…は、
(1/5!)*(π/2)5=0.07969262625…
に近い!
が、少し違うか。
SIT2 −0.004673765972…は、
(1/7!)*(π/2)7=−0.004681754135…
に近い…けど、違うなあ。
SIT1 0.0001514841861…は、
(1/9!)*(π/2)9=0.0001604411848…
とは、ちょっと違うなあ…。
やっぱりこれはテイラー級数じゃありませんねえ。
では一体何でしょう?
MYCPU80でCP/Mを![第41回]
2014.9.22upload
前へ
次へ
ホームページトップへ戻る