warning: using integer absolute value function ‘abs’ when argument is of floating-point type ‘double’
警告:
引数が浮動小数点型 ‘double’ であるのに
引数が整数の絶対値関数 ‘abs’ を使用している。
[-Wabsolute-value]
■1.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()を使用してください。
■2.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)で異常終了します。
参考:
Linux Programmer’s Manual (3)
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/abs.3.html