絶対値を求める

C++で数値の絶対を求めるには abs 関数を使用します。abs 関数には、扱う型によっていくつかのものが多重定義されています。使用するヘッダも異なりますので注意が必要です。

整数

整数の絶対値を求めるには <cstdlib> ヘッダをインクルードします。

#include <iostream>
#include <cstdlib>
 
int main()
{
  int value;
  std::cin >> value;
  std::cout << std::abs(value) << std::endl;
  return 0;
}

整数用の abs 関数では、実引数がその型の表現範囲における最小値(int 型では INT_MIN)の場合には未定義の動作を引き起こすことがあります。この現象は、負の値の内部表現が2の補数の場合に起こります(現存する処理系のほぼすべてが該当します)。

整数用の abs 関数としては、int 型版と long 型版があります。long 型版を明示的に呼び出すには、labs 関数を使うこともできます。

浮動小数点数

浮動小数点数用の abs 関数を呼び出すには、<cmath> ヘッダをインクルードします。

#include <iostream>
#include <cmath>
 
int main()
{
  double value;
  std::cin >> value;
  std::cout << std::abs(value) << std::endl;
  return 0;
}

浮動小数点数用の abs 関数としては、float 型版、double 型版、long double 型版の 3種類が多重定義されています。abs 関数の代わりに fabs 関数を使った場合も同じ意味になります。

複素数

複素数すなわち complex クラステンプレート用の abs 関数は、complex クラステンプレートと同じ <complex> ヘッダで宣言されています。

#include <iostream>
#include <complex>
 
int main()
{
  std::complex<double> value;
  std::cin >> value;
  std::cout << std::abs(value) << std::endl;
  return 0;
}

実引数依存の名前検索が働きますので、std::abs ではなく、単に abs とするだけでも呼び出すことができますが、整数用や浮動小数点数用のものとの対称性や、標準準拠どの低い(実引数依存の名前検索が正常に機能しない)処理系対策のためには、明示的に std:: をつけるか、using 宣言を行う方がよいかもしれません。

このエントリーを含むはてなブックマーク