atan2

atan2, atan2f, atan2l
tanの逆関数,atanの拡張版,現実的にはこっちのほうが使う機会が多そう.
atanと異なり,象限による場合分けが考慮される.
一部の関数はC99から実装?

引数の型に応じて明示的に関数を変えないと大変な目に合うので注意,stm32マイコンの場合atan2atan2fの間で7kBくらい差があった.

高速化のためのいろいろ

三角関数を扱うのもあり,浮動小数点を使うことがたいていだと思う.
しかしCortex-M0などのFPUが載ってないマイコンにはあまり進んでやらせたくないので,なんとかして軽くできないのか考える.
実際の実装に必要な処理を考えてみる.
テーブルを持つ→多分一番楽,二次元配列で持つというのが最も楽だけど半端ない容量食いそう…

近似式でatan2の処理を高速化してみる
この記事の方法が一番楽に実装できそう.
0~45°までの処理が実現できればあとは軸の反転と象限の場合分けで対処できる.
どれだけの精度になるか完全に検証不足だけど標準のatan2関数と比較したところ最大0.05度ほどであった.
正直角度の分解能からすると微妙かもしれないが一度これで試してみるかなぁ…

いろいろ出てくるけどもうできるやつから実装して評価するしかないか…
Calculate atan2 without std functions or C99
Fixed-point atan2
Fast computation of arctangent functions for embedded applications: A comparative analysis
Performing efficient arctangent approximation
How to Find a Fast Floating-Point atan2 Approximation
https://gist.github.com/volkansalma/2972237
Speeding up atan2f by 50x
DSP Trick: Fixed-Point Atan2 With Self Normalization
Fast & accurate atan/arctan approximation algorithm
Speeding up atan2f by 50x
Atan2 Faster Approximation
Arctan(x) using CORDIC
CMSIS-DSPにも実装がある模様。 https://github.com/ARM-software/CMSIS-DSP/blob/main/Source/FastMathFunctions/arm_atan2_f32.c
メモリがたくさんあればルックアップテーブル(LUT)でやればいい例が結構でてくる.
https://github.com/xiezhq-hermann/atan_lookup/blob/master/atan.cpp