C ++でのintのInfinityへの設定


114

私が持っているint a「無限大」に等しくする必要があること。これは、

int b = anyValue;

a>b 常に真です。

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


float無限を表す値を持つsを使用できます。
Xeo

1
@jozefg-わかりました。それは、ユーザーのチェックではなくMax Value、言語の実装です。
keyboardP

4
@jozefgハ、私はあなたがA *を実装するつもりだったと思った。私がいたので、近いです!
Etienne de Martel

2
@jozefg-それは理にかなっています。OPが実際にa>bチェックを実行する必要があると思った:)
keyboardP

1
@ひかり:いいえ、整数型で無限を表す方法はないと言っています。オーバーロードされた演算子でクラスを作成できます。
キース・トンプソン、

回答:


130

整数は本質的に有限です。あなたが得ることができる最も近いのはの最大値に設定aすることintです:

#include <limits>

// ...

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

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

本当に無限大必要な場合は、floatまたはなどの浮動小数点型を使用してdoubleください。その後、次のようにして無限大を取得できます。

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

37
また、本当にintとしてinfinity 必要な場合は、比較演算子をオーバーロードし、「is_infinity」というブール変数を持つラッパークラスを記述します。

@WTP彼がダイクストラのアルゴリズム実装のためにそれを必要とすることを考えると、それが必要だとは思えません。しかし、それ以外の場合は最も賢明な選択です。
Etienne de Martel、2011

4
ダイクストラのアルゴリズムを実装していないが、他の何かのためにそれを必要とする将来の訪問者のためにコメントを追加しました。:)

ここでゴールドバッジの候補者を獲得したようです。:)あなたの両方に+1!
Mysticial 2012年

2
intソリューションを使用する場合は、算術に非常に注意する必要があります。「無限大」に正の数を追加すると、非常に予期しない結果が生じます。
ラムダ妖精

67

整数は有限なので、悲しいことに、それを真の無限大に設定することはできません。ただし、これを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();

数値制限の詳細な説明はここにあります

ハッピーコーディング!

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


6
...あなたが使用したい場合max()infinity()数値型が不明であるテンプレートであなたが使用する必要があります+/-infinity()IFFをstd::numeric_limits<T>::has_infinityし、そうでない場合min()max()
ベン・ジャクソン

13

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
}

10
または ... floatとstd::numeric_limits<float>::infinity()
Xeo

1
@Xeo、確かに、それもオプションです:)
bdonlan

5

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

ただ使用する: (unsigned)!((int)0)

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

さらに良い

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

そして、あなたのコードでINFを使用してください


4
というか#define INF ((unsigned) ~0)ここを見てください
ポールサンダース


-2

intの最小値と最大値

Int -2,147,483,648 / 2,147,483,647 Int 64 -9,223,372,036,854,775,808 / 9,223,372,036,854,775,807

aを9,223,372,036,854,775,807に設定できると思いますが、それはint64である必要があります

いつもaをもっとおもしろくしたいなら、なぜそれをチェックする必要があるのですか?常にtrueに設定するだけ


1
それは実装に依存します。C ++には「Int64」はありません(C ++ 11のものを数えない限りcstdint)。
Etienne de Martel

@ Shaun、Etienneの発言をさらに詳しく説明するために、stackoverflow.com / questions / 589575 / size - of - int-long-etcは、intC ++の意味と関連する型について説明しています。
マイクサミュエル

私はこれまでにembarcadero c ++ビルダーを使用したことがあり、__ int64を持っています。他のc ++にもそれがないことを知りませんでした。
Shaun07776 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.