C ++ 'da int'i Infinity olarak ayarlama


114

int a"Sonsuza" eşit olması gereken bir var. Bu, eğer

int b = anyValue;

a>b her zaman doğrudur.

Bunu mümkün kılan herhangi bir C ++ özelliği var mı?


floatSonsuzluğu temsil eden bir değere sahip olan s kullanabilirsiniz .
Xeo

1
@jozefg - Tamam, yani bu kullanıcının peşinde olduğu bir kontrol değil, sadece Max Valuedilin uygulanması.
keyboardP

4
@jozefg Ha, A * 'yı uygulayacağınızı düşündüm. Ben çok yakındım!
Etienne de Martel

2
@jozefg - Bu mantıklı. OP'nin a>bkontrolü gerçekten yapmak istediğini sanıyordum :)
keyboardP

1
@Hikari: Hayır, bir tamsayı türünde sonsuzluğu temsil etmenin bir yolu olmadığını söylüyorum. Aşırı yüklenmiş işleçlere sahip bir sınıf oluşturabilirsiniz.
Keith Thompson

Yanıtlar:


131

Tam sayılar doğası gereği sonludur. Alabileceğiniz en yakın ayarlayarak olduğu aiçin intmaksimum değerden s':

#include <limits>

// ...

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

Uygulamanızda 32 bit genişliğinde 2^31 - 1(veya 2 147 483 647) olurdu int.

Gerçekten sonsuzluğa ihtiyacınız varsa , floatveya gibi bir kayan nokta sayı türü kullanın double. Daha sonra şunlarla sonsuza ulaşabilirsiniz:

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

37
Ve int olarak sonsuza gerçekten ihtiyacınız varsa , karşılaştırma işleçlerini aşırı yükleyen ve "is_infinity" adında bir boole değişkeni olan bir sarmalayıcı sınıfı yazın.

@WTP Dijkstra'nın algoritma uygulaması için buna ihtiyacı olduğunu düşünürsek, bunun gerekli olacağından şüpheliyim. Ama aksi takdirde en mantıklı seçim bu.
Etienne de Martel

4
Dijkstra'nın algoritmasını uygulamayan, ancak başka bir şey için ona ihtiyaç duyan gelecekteki ziyaretçiler için yorum ekledim. :)

Görünüşe göre altın rozet için bir adayımız var. :) İkiniz için +1!
Gizemli

2
intÇözümü kullanırsanız, aritmetikte çok dikkatli olmanız gerektiğini unutmayın: "sonsuza" pozitif bir sayı eklemek çok beklenmedik bir sonuç verecektir.
Lambda Fairy

67

Tam sayılar sonludur, bu yüzden ne yazık ki onu gerçek bir sonsuza ayarlayamazsınız. Bununla birlikte, bunu bir int'in maksimum değerine ayarlayabilirsiniz, bu, başka herhangi bir int'e eşit veya daha büyük olacağı anlamına gelir, yani:

a>=b

her zaman doğrudur.

Bunu yaparsın

#include <limits>

//your code here

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

//go off and lead a happy and productive life

Bu normalde 2.147.483.647'ye eşit olacaktır.

Gerçekten gerçek bir "sonsuz" değere ihtiyacınız varsa, bir double veya bir float kullanmanız gerekir. O zaman bunu basitçe yapabilirsiniz

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

Sayısal sınırlarla ilgili ek açıklamalar burada bulunabilir

Mutlu Kodlama!

Not: WTP'de belirtildiği gibi, "sonsuz" olan bir int'e sahip olmak kesinlikle gerekliyse, int için bir sarmalayıcı sınıfı yazmanız ve karşılaştırma işleçlerini aşırı yüklemeniz gerekir, ancak bu muhtemelen çoğu proje için gerekli değildir.


6
... ve sayısal türün bilinmediği bir şablonda max()veya kullanmak infinity()istiyorsanız, +/-infinity()iff std::numeric_limits<T>::has_infinityve başka şekilde kullanmanız gerekecek min()vemax()
Ben Jackson

13

intdoğası gereği sonludur; gereksinimlerinizi karşılayan hiçbir değer yoktur.

Ancak türünü değiştirmek bistiyorsanız, bunu operatör geçersiz kılmalarıyla yapabilirsiniz:

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
Veya ... sadece float ve kullanabilirsiniz std::numeric_limits<float>::infinity().
Xeo

1
@Xeo, elbette, bu da bir seçenek :)
bdonlan

5

Bu benim için gelecekte bir mesajdır:

Sadece kullan: (unsigned)!((int)0)

Tüm bitleri 1'lere (birlere) atayarak herhangi bir makinede mümkün olan en büyük sayıyı oluşturur ve ardından işaretsiz olarak çevirir.

Daha iyi

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

Ve sonra kodunuzda sadece INF kullanın


4
Sanırım buraya#define INF ((unsigned) ~0) bakın demek istiyorsun .
Paul Sanders


-2

int min ve maks değerleri

Yurt İçi -2,147,483,648 / 2,147,483,647 Uluslararası 64 -9,223,372,036,854,775,808 / 9,223,372,036,854,775,807

a'yı 9,223,372,036,854,775,807'ye eşit olarak ayarlayabilirsiniz, ancak bunun bir int64 olması gerekir

a'nın her zaman daha büyük olmasını istiyorsanız, bu b neden kontrol etmeniz gerekiyor? sadece her zaman doğru olacak şekilde ayarla


1
Bu uygulamaya bağlıdır. C ++ 'da "Int64" yoktur (maddeleri C ++ 11'lerde saymazsanız cstdint).
Etienne de Martel

@Shaun, Etienne'in söylediklerini genişletmek için stackoverflow.com/questions/589575/size-of-int-long-etc , intC ++ 'daki anlamını ve ilgili türleri açıklıyor .
Mike Samuel

Sadece embarcadero c ++ oluşturucuyu kullandım ve bir __int64 var, diğer c ++ 'nın da olmadığını bilmiyordum.
Shaun07776
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.