【C++】数値の符号を調べる方法
一般的に、符号を返す関数とは、正の値なら1を、負の値なら-1を、0なら0を返すと言う動作をします。
簡単に考えるなら、if文で書くだろうけど、それだと、何度も呼び出す場合は、条件分岐の動作が処理時間に大きな影響を与えてしまいます。また、条件分岐は最適化されづらいため、最適化による高速化の恩恵を殆ど受けないです。
それなら、絶対値で割れば良いとか言い出す人がいそうですが、その方法では、0除算の可能性があるし、除算のコストも意外と馬鹿に出来ない。
そこで、C++では真偽値が1と0に対応する事を利用して、簡単な計算式によって狙った値を返させれば、0除算も発生せず、条件分岐も使わない。
template<typename _Tp> inline int sign(_Tp val){ return 1 - (val <= 0) - (val < 0); }