[c++] ちょっとカッコいい数値の符号判別

c/c++で数値の符号を判定したい。

頻繁に使うので関数にしたい。

ぱっと思いつく範囲では、 「条件分岐」か「絶対値で除算」するくらいだと思います。

Cで書くなら

// if で条件分岐
double sign(double n) {
    if(n > 0) return 1;
    else if(n < 0) return -1;
    else return 0;
}
// 絶対値で除算
double sign(double n) {
    if (n == 0) return 0;
    else return n / abs(n);
}

大抵の場合はこんな感じになると思います。

それでは、ちょっとカッコいい書き方!

double sign(double n) {
    return (n > 0) - (n < 0);
}

n > 0n < 0の部分で真偽値がそれぞれ返されるので、nが正なら1 - 0 = 1、負なら0 - 1 = -10なら0 - 0 = 0、というように正しく判定できます。

C++ならテンプレートを使ってあげることでキャストのコストを減らすこともできます。(バイナリのサイズは少し大きくなるかもしれませんが…)

template<class T>
T sign(T n) {
    return (n > 0) - (n < 0);
}

可読性は多少、下がるかもしれませんが、短く書けて素敵です。

以上、ちょっとカッコいい数値の符号判定法でした。