符号を取得する | Programming Place Plus C言語編 逆引き

トップページC言語編逆引き

このページの概要 🔗

以下は目次です。

目的 🔗

ある数値の符号を取得したいとします。

「符号を取得する」といっても、符号そのものを値として表現することはできませんから、正の数ならば 1、負の数ならば -1 を取得することにします。

符号を表現する方法として、1 と -1 を使うと都合が良いことがあります。たとえば、「変数 a の符号を、変数 b の符号と同じにする」という操作を、次のように実現できます。get_sign関数が、符号を返す関数です。

int a = 10;
int b = -20;

a = abs(a) * get_sign(b);

C99規格ではこの処理は、標準ライブラリの copysign関数で実現できます。

方法①(条件分岐を使う) 🔗

if文なり条件演算子なりを使って自力で書きます。

#include <stdio.h>

/*
    符号を取得する

    引数
        num: 対象の数値
    戻り値
        num が正なら 1、負なら -1。
        num が 0 のときにも 1 を返す。
*/
inline int get_sign(double num)
{
    return num >= 0 ? 1 : -1;
}

int main(void)
{
    printf("%d\n", get_sign(10));
    printf("%d\n", get_sign(-20));
    printf("%d\n", get_sign(0));
}

実行結果:

1
-1
1

方法②(条件式の結果を利用する) 🔗

条件式と減算を組み合わせて実現する方法があります。

#include <stdio.h>

/*
    符号を取得する

    引数
        num: 対象の数値
    戻り値
        num が正なら 1、負なら -1。
        num が 0 のときにも 1 を返す。
*/
inline int get_sign(double num)
{
    return (num >= 0) - (num < 0);
}

int main(void)
{
    printf("%d\n", get_sign(10));
    printf("%d\n", get_sign(-20));
    printf("%d\n", get_sign(0));
}

実行結果:

1
-1
1

条件式の結果は必ず 0 か 1 になるので(第13章)、「0以上か? - 0未満か?」という式で、目的通りの結果を得られます。

左側の条件式から等号を外して (num > 0) - (num < 0) とすると、num が 0 のときの結果が 0 になります。


参考リンク 🔗


更新履歴 🔗



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る