見出し画像

円を描くには三角関数が欲しい

さて点を打って線を引く話を書いたのですが、一般的なBASICは実数演算がサポートされていますし、三角関数も組み込まれています。そうは言っても実数を扱うのは貧弱な8ビットCPUにとっては重い仕事ですし、TInyBASICやアセンブラのレベルでは実数の処理なんて用意されていません。

線を引く - 単純そうに見える奥の深い世界

とはいえグラフィック画面があれば円も描きたくなりますし、特に円弧や扇型を描こうとすれば三角関数が登場します。だからと言ってBASICが持っている小数演算ルーチンを借用しようなんてことは考えません。この時代のグラフィックというのは、せいぜい解像度が256程度なので最終的な精度は必要なく、その昔、人間がやっていたように三角関数表をあらかじめ作成して、その表を引いて計算すれば充分です。ということで1度毎の関数の値を表に作っておけば良いわけですし、三角関数の場合は0~90度までの範囲があれば、あとはそれをアレコレすれば間に合います。

整数で演算したいのですが三角関数の値は0~1の範囲の小数なので、整数になるように値にゲタを履かせます。後で戻すことを考えるとゲタは2の累乗にしておくのが便利で表には8ビットであれば128、16ビットであれば32768倍の値を格納しておきます。こうすれば計算が済んでからシフト演算で本来の値に戻せるわけです。

SIN 45度 ⇒ 0.70710678118 これを32768倍すれば23170
32に対するSIN(45度)が必要であれば、32✕23170÷32768=23
正しい計算(32✕0.70710678118)をしても整数部分は結局同じ値

こうして整数演算だけで高速に三角関数を使った計算ができるわけです。表に必要なメモリは値を16ビットで作っても180バイトで済むわけです。

とはいえ整数演算だけで処理するためには、計算途中でオーバーフローが発生しないような配慮も要りますし(ゲタを小さめにするとか値ごとに先にゲタの調整をするとか)、複雑な計算になると誤差が積み重なって、結果として表示されるグラフィックの図形が微妙にズレ始めます。

結局のところ、やっぱりちゃんと関数の値を計算しないとアカンかなと思い始めるのです。果たして三角関数を自力で計算するには、いったいどうやるんだろうと教科書を調べると、いろいろな方法が見つかるのですが、例えばテイラー展開なんて、計算が複雑な上に計算量も多くて、とてもやっていられないなと思うわけですよ。

テイラー展開

まあ最初に三角関数の公式が欲しかったのは中学生のときだったので、さすがにテイラー展開を理解するのは辛かったという話もあったのですが。そこでさらに調べると計算機向けのアルゴリズムとしてCORDICというのが見つかりました。

CORDIC

まあ説明は相変わらず何を言っているのかわからない数学の式が並ぶのですが、幸いなことに最後の方に計算のためのプログラムコードが書いてあることが多いです(当時はFORTRANだったかな)。これなら読めばわかります。ヤレヤレこれで何とか計算できそうだなというところまで来るわけですね。

三角関数の計算に関する話題

TNJ-084: 足す引くで三角関数計算ができちゃうデジタル演算CORDIC(前編)

https://www.analog.com/jp/resources/technical-articles/weblab-tnj084-digital-calculation-algorithm-cordic-part-1.html

何しろコプロセッサーと呼ばれる小数の計算をハードウェアで何とかしてくれるチップが使えるようになるまでは(最初はオプションのハード、その後内蔵されるようになった)、ひたすらソフトでこういった計算をしていたわけで、プログラミング言語に三角関数が組み込まれていたとしても、その処理は決して速いものではなく、複雑な電磁気の計算をしたり3D描画を必要としたときには、このCORDICは活躍しました。

CORDICを使ってsin,cos,sinh,coshなどを求める

CORDIC アルゴリズム

今は三角関数も整数よりはもちろん遅いのですが、アセンブラの命令一つで計算できちゃうので、もうあまり頑張る必要も無くなったのですが、組み込みなどでそんな命令なんて無いよ!という時にはまだ活躍することがあります。もちろん、そんなときの専用ハードウェアというのも用意されているようですが。

STM32G4 Cordic コプロセッサ

https://www.stmcu.jp/wp/wp-content/uploads/files/presentation-ja/STM32G4/29_STM32G4-Peripheral-Cordic-Coprocessor-(CORDIC)-J-.pdf

計算機というカテゴリは世の中的には数学の応用で、理系に分類されることも多いのですが、その割には(計算機でしか登場しないミョウチクリンな数学はたくさん出てくるのですが)高校で習うような数学を使わないことも多く、三角関数なんて呼び出したことが無いなんていう人も多かったりするのかもしれません。でも物理現象に対するプログラムを書こうとすれば必須ですし、グラフィック画面に何か描くときにも、それを回転させたくなれば回転行列という三角関数のカタマリのような計算も出てきます。そんな訳で未だにPCの近くには公式集が鎮座しています(数学って滅多なことではバージョンが上がらないのでずっと使えます)。

モノグラフ 24.公式集 改訂版 数学

そういえばベクトルフォントを扱うときにも数式とは戦った覚えが。そんな話もまたいずれ。

ヘッダ画像は、以下のものを使わせていただきました。
https://commons.wikimedia.org/wiki/File:Sinus_und_Kosinus_am_Einheitskreis_1.svg
By Stephan Kulla (User:Stephan Kulla) - Own work, CC0, https://commons.wikimedia.org/w/index.php?curid=57551646

#円 #三角関数 #テイラー展開 #CORDIC #数学 #数表

この記事が気に入ったらサポートをしてみませんか?