C++ で負の無限大を定義して使用する

Faiq Bilal 2023年10月12日
  1. C++ で numeric_limits::infinity() の負の積を使用する
  2. cmath ライブラリの INFINITY 定義を使用する
C++ で負の無限大を定義して使用する

この記事では、C++ で負の無限大を表現する際の問題について説明し、考えられる解決策をいくつか示します。

C++ は IEEE-754 標準を使用して浮動小数点数を表します。 浮動小数点データ型には、floatdouble、および long double の 3つがあります。

これらの変数型はすべて、int データ型では格納できない数値を格納できます。

無限大は C++ では inf と記述され、正の数値を null 値で除算するか、64 ビットに格納できる数値よりも大きい数値を計算することになります。

符号なしまたは正の浮動無限値は、cmathlimits などのさまざまな C++ ライブラリで定義されていますが、C++ には負の無限大の標準はありません。

C++ で負の無限大を表現する標準的な方法がないため、C++ で負の無限大を表現して使用するための信頼できる方法をいくつか紹介します。

C++ で numeric_limits::infinity() の負の積を使用する

C++ で limits ライブラリを使用します。

#include <iostream>
#include <limits>

using namespace std;

int main() {
  float f = numeric_limits<float>::infinity();

  float negInf = f * -1;

  cout << "The value of f is = " << f << endl;
  cout << "The value of negInf is = " << negInf << endl;
  cout << "The value of f + negInf is = " << f + negInf << endl;

  return 0;
}

上記のコード スニペットでは、limits ライブラリの infinity メソッドが正の無限大の値を返します。

構文は次のとおりです。

numeric_limits<T>::infinity()

上記の定義では、山括弧内の T はテンプレート クラスを表し、実際の実装では、numeric_limits メソッドを使用するデータ型に置き換えられます。 上記のコード スニペットでは、float データ型が使用されていますが、double も同様に使用できます。

ただし、intbool などの整数データ型は本質的に有限であるため、infinity() メソッドは非整数データ型に対してのみ有効です。

上記のコードの出力は次のとおりです。

The value of f is = inf
The value of negInf is = -inf
The value of f + negInf is = nan

上記の例に見られるように、infinity() メソッドを使用して、正の無限大の値が float 型変数 f に代入されます。 次に、f に -1 を掛けるという非常に単純で直感的なアプローチが使用され、その結果が negInf という名前の変数に格納されます。これにより、負の無限大の値が negInf に格納されます。

上記の出力に見られるように、この有効なメソッドは変数に負の無限値を代入します。 このメソッドをさらにテストするために、fnegInf を一緒に追加すると、Not-a-Number を表し、計算できない値を示す nan が返されます。

この結果は、無限値に関する IEEE-754 規則と一致するため、計算上安全です。

cmath ライブラリの INFINITY 定義を使用する

cmath ライブラリは、一般的な数学演算と変換を処理するための多くの便利なメソッドと関数を備えた別の C++ ライブラリです。

このライブラリには、INFINITY という名前の無限値の定義も含まれており、numeric_limits<T>::infinity() とほぼ同じ方法で使用でき、float の両方に直接割り当てることができます。 double データ型。

前の例と同じ方法を使用して、符号なしまたは正の無限大の値に負の値を掛けると、負の無限大の値が返されます。

#include <cmath>
#include <iostream>

using namespace std;

int main() {
  long double f = INFINITY;
  long double negInf = f * -1;

  cout << "The value of f is = " << f << endl;
  cout << "The value of negInf is = " << negInf << endl;

  cout << "The value of f + negInf is = " << f + negInf << endl;
  return 0;
}

上記のコードの出力は次のとおりです。

The value of f is = inf
The value of negInf is = -inf
The value of f + negInf is = nan

ご覧のとおり、どちらのメソッドも同じ出力を生成し、C++ で負の無限大を実装するために安全に使用できます。