2018年3月24日土曜日

atan2()なんて知らなかった

1980年台からコンピュータをいじっている。
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 件のコメント:

コメントを投稿