C言語に触れたのは専門学校へ行っている頃からなので、1987年頃からだ。もう30年になるのか。
昨日書いた記事のプログラムを書くために、逆正接関数atan()を使っている。
atan()に限らず、三角関数の中でtan()系列は、無限が出てくる時があるため、使用には注意が必要だ。Bugの原因にもなるので、ちらっと見かけただけでもなんか嫌な気分になる。
またatan()は、y/xの計算した値を引数に与えるため、第一象限と第四象限しかまともに計算できない。
というわけで、昔から以下のようなラッパを組んで、y/xではなく、(x,y)で計算するようにしていた。
static double atanXYabs( double x, double y ) { double absX = fabs(x); double absY = fabs(y); if( absX < absY ) { return( M_PI/2 - atan(absX/absY) ); } return( atan(absY/absX) ); } double atanXY( double x, double y ) { double angle = atanXYabs(x,y); if( 0.0 <= y ) { if( 0.0 <= x ) { return( angle ); // 第一象限 } return( M_PI - angle ); // 第二象限 } if( 0.0 <= x ) { return( -angle ); // 第四象限 } return( angle - M_PI ); // 第三象限 }昔はM_PIも無かったりして、 '80年台に使っていたものとは微妙に違うがだいたい同じ。
「いつもいつも面倒だな。だからtan()系は嫌いなんだ」と思っていたが、他の人も困っているのでは?と思って、調べてみたら atan2() という関数を発見。
引数の順序は違うが、ほぼ同じ関数だ。
atan2()はいつ頃からあったのだろう?
自力で問題を解決してしまうと、それ以降困らないので、わざわざ調べない。
インターネットが全く普及していない'80年台ごろだったので、何を調べるのも大変だった。
とはいえ、なんと馬鹿なんだろう。
atan2()で組み直した。
0 件のコメント:
コメントを投稿