【C言語】
絶対値を求めるabs(整数)とfabs(浮動小数点)

abs(整数) 絶対値を求める fabs(浮動小数点)

warning: using integer absolute value function ‘abs’ when argument is of floating-point type ‘double’

警告:
引数が浮動小数点型 ‘double’ であるのに
引数が整数の絶対値関数 ‘abs’ を使用している。
[-Wabsolute-value]

■absとfabsの使い方

#include    <stdlib.h>
#include    <stdio.h>
#include    <math.h>
int main(void)
{
    printf("%d\n",abs(-3.14159));   // 浮動小数点にasb()は不適切

    printf("%f\n",fabs(-3.14159));  //  修正例
}

引数が浮動小数点の場合abs()ではなくて、
適切な関数fasb()を使用してください。

fabs()を使う時は
#include <math.h>を忘れないでください。


■abs(INT_MIN)に注意

runtime error: negation of -2147483648 cannot be represented in type ‘int’; cast to an unsigned type to negate this value to itself

警告:最大の負整数の絶対値は、定義されていない。
[-fsanitize=undefined]

#include    <stdlib.h>
#include    <stdio.h>
#include    <limits.h>
int neg(int a)
{
  return -a;
}
int main(void)
{
    printf("%d\n",    INT_MAX );
    printf("%d\n",    INT_MIN );
    printf("%d\n",abs(INT_MIN));
    printf("%d\n",neg(INT_MIN));
}

(1) abs(INT_MIN)の動作はマニュアルによると決まっていないそうです。(処理系依存?)
gccの場合
INT_MAX= 2147483647
INT_MIN=-2147483648
なので INT_MIN の絶対値 2147483648 はint で表現できないため。

(2) -INT_MINの計算は未定義動作となり、
gcc -fsanitize=undefined (未定義動作検出オプション)でコンパイルし走らせるとneg(INT_MIN)で異常終了します。