web-dev-qa-db-ja.com

C ++でintをInfinityに設定する

「無限」に等しくする必要があるint aがあります。これは、

int b = anyValue;

a>bは常にtrueです。

これを可能にするC++の機能はありますか?

99
jozefg

整数は有限であるため、残念ながら真の無限大に設定することはできません。ただし、intの最大値に設定することはできますが、これは他のintより大きいか等しいことを意味します。つまり:

a>=b

常に真実です。

あなたはこれをするだろう

#include <limits>

//your code here

int a = std::numeric_limits<int>::max();

//go off and lead a happy and productive life

通常、これは2,147,483,647に等しくなります

真の「無限」値が本当に必要な場合は、doubleまたはfloatを使用する必要があります。その後、単にこれを行うことができます

float a = std::numeric_limits<float>::infinity();

数値の制限に関する追加の説明があります here

ハッピーコーディング!

注:WTPで述べたように、「無限」のintが絶対に必要な場合、intのラッパークラスを記述し、比較演算子をオーバーロードする必要がありますが、これはおそらくほとんどのプロジェクトでは必要ありません。

59
jozefg

整数は本質的に有限です。最も近いのは、aintの最大値に設定することです。

#include <limits>

// ...

int a = std::numeric_limits<int>::max();

実装でintが32ビット幅の場合、2^31 - 1(または2 147 483 647)になります。

本当に無限が必要な場合は、floatdoubleなどの浮動小数点型を使用します。その後、無限大を取得できます。

double a = std::numeric_limits<double>::infinity();
112

intは本質的に有限です。要件を満たす値はありません。

ただし、bのタイプを変更する場合は、演算子のオーバーライドを使用してこれを行うことができます。

class infinitytype {};

template<typename T>
bool operator>(const T &, const infinitytype &) {
  return false;
}

template<typename T>
bool operator<(const T &, const infinitytype &) {
  return true;
}

bool operator<(const infinitytype &, const infinitytype &) {
  return false;
}


bool operator>(const infinitytype &, const infinitytype &) {
  return false;
}

// add operator==, operator!=, operator>=, operator<=...

int main() {
  std::cout << ( INT_MAX < infinitytype() ); // true
}
12
bdonlan

これは将来の私へのメッセージです。

次を使用します:(unsigned)!((int)0)

すべてのビットを1に割り当てることにより、任意のマシンで可能な最大数を作成し、それを符号なしにキャストします

さらに良い

#define INF (unsigned)!((int)0)

そして、あなたのコードでINFを使うだけです

3
Wilmer E. Henao

INT_MAXを使用することもできます。

http://www.cplusplus.com/reference/climits/

これは、numeric_limitsを使用するのと同等です。

2
nicodjimenez