Ameba Ownd

アプリで簡単、無料ホームページ作成

IT MEMO'S

VC++においてmathのatan(arctangent、アークタンジェント)が90°の時について

2021.05.07 07:47

当たり前と言われればそうなのかもしれませんが、そうなの?って思ったので残します。

一般的にはarctangentの取りうる範囲は−90° < y < 90°であり90°になることはありませんが、VC++のatanは形式的に90°になることがあるようです。

プログラム上確かにX軸に対して垂直であれば、arctangentが90°になってくれたら処理としては嬉しいのですがその挙動が少し驚きました。

例えば以下のような処理を書いたとします。

これはあからさまにゼロ除算をしているのでコンパイルエラーになります。

では次のようにしたらどうでしょうか。

出力結果

これはもゼロ割ですがコンパイル時にはそれはわからないのでコンパイルは通ります。そして出力結果ですが90°になります。

どういうことかというと、1.0/0.0を計算したとき分子が1.0であるためゼロ割をinfつまり無限大として管理するので、atanの引数に無限大を入れたら90°であるという理屈のようです。

確かにそうだと言われたらそうなのかもしれませんが、infになった時点で開発者の予期せぬプログラムになっているのでこれを引数として使うことには少々抵抗があります。


さらに言えば前者の1.0/0.0もatanがinfを入力として想定しているならコンパイル通してくれてもいいんじゃないかと思います。

これがコンパイルエラーになるってことはatanの引数にinfを許しているのはこのようにコーディングする人が多そうだから例外的に許しているってことなのでしょうか。

なんとなく例外ロンダリングしている気がして気持ち悪いです。

ここからは余談ですが次のようにしてみた場合を見てみます。

出力結果

今度は1.0/0.0ではなく0.0/0.0にしてみました。0.0のゼロ除算です。これは分子が0.0なのでinf(無限大)にはならずnan(ind)になりました。

nanは「not a number」でindは「indeterminate」ですが非数とか不定数を表しています。これをatanに入れると結果もnan(ind)です。これはまぁ分かります。