Ustawienie int na Infinity w C ++

114

Mam to, int aco musi być równe „nieskończoności”. Oznacza to, że jeśli

int b = anyValue;

a>b jest zawsze prawdą.

Czy jest jakaś funkcja C ++, która mogłaby to umożliwić?

Daniel Gratzer
źródło
Możesz po prostu użyć floats, które mają wartość reprezentującą nieskończoność.
Xeo
1
@jozefg - OK, więc nie chodzi o sprawdzenie, o które chodzi użytkownik, tylko o Max Valueimplementację języka.
keyboardP
4
@jozefg Ha, pomyślałem, że zamierzasz wdrożyć A *. Byłem tak blisko!
Etienne de Martel
2
@jozefg - To ma sens. Myślałem, że OP chce faktycznie przeprowadzić a>bkontrolę :)
keyboardP
1
@Hikari: Nie, mówię, że nie ma sposobu na przedstawienie nieskończoności w typie całkowitoliczbowym. Możesz stworzyć klasę z przeciążonymi operatorami.
Keith Thompson

Odpowiedzi:

130

Liczby całkowite są z natury skończone. Najbliżej można dostać się poprzez ustawienie ana int„s wartości maksymalnej:

#include <limits>

// ...

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

Który byłby 2^31 - 1(lub 2 147 483 647) jeśli intma 32 bity szerokości w twojej implementacji.

Jeśli naprawdę potrzebujesz nieskończoności, użyj liczb zmiennoprzecinkowych, takich jak floatlub double. Możesz wtedy uzyskać nieskończoność za pomocą:

double a = std::numeric_limits<double>::infinity();
Etienne de Martel
źródło
37
A jeśli naprawdę potrzebujesz nieskończoności jako int , napisz klasę opakowania, która przeciąża operatory porównania i ma zmienną boolowską o nazwie „is_infinity”.
@WTP Biorąc pod uwagę, że potrzebuje tego do implementacji algorytmu Dijkstry, wątpię, by było to konieczne. Ale inaczej jest to najbardziej rozsądny wybór.
Etienne de Martel
4
Dodałem komentarz dla przyszłych odwiedzających, którzy nie implementują algorytmu Dijkstry, ale potrzebują go do czegoś innego. :)
Wygląda na to, że mamy tutaj kandydata do złotej odznaki. :) +1 dla Was obojga!
Mysticial
2
Zauważ, że jeśli korzystasz z introzwiązania, musisz bardzo uważać na arytmetykę: dodanie liczby dodatniej do „nieskończoności” da bardzo nieoczekiwany wynik.
Lambda Fairy
67

Liczby całkowite są skończone, więc niestety nie możesz ustawić ich na prawdziwą nieskończoność. Jednak możesz ustawić ją na maksymalną wartość int, oznaczałoby to, że byłaby większa lub równa każdemu innemu int, tj .:

a>=b

jest zawsze prawdą.

Zrobiłbyś to przez

#include <limits>

//your code here

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

//go off and lead a happy and productive life

Zwykle będzie to 2 147 483 647

Jeśli naprawdę potrzebujesz prawdziwej „nieskończonej” wartości, musisz użyć double lub float. Następnie możesz to po prostu zrobić

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

Dodatkowe wyjaśnienia dotyczące limitów liczbowych można znaleźć tutaj

Miłego kodowania!

Uwaga: Jak wspomniał WTP, jeśli absolutnie konieczne jest posiadanie int, które jest „nieskończone”, musiałbyś napisać klasę opakowującą dla int i przeciążać operatory porównania, chociaż prawdopodobnie nie jest to konieczne w przypadku większości projektów.

Daniel Gratzer
źródło
6
... a jeśli chcesz użyć max()lub infinity()w szablonie, w którym typ numeryczny jest nieznany, będziesz musiał użyć +/-infinity()iff std::numeric_limits<T>::has_infinitylub innego min()imax()
Ben Jackson
13

intjest z natury skończony; nie ma wartości, która spełniałaby Twoje wymagania.

Jeśli jednak chcesz zmienić typ b, możesz to zrobić za pomocą zastąpień operatora:

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
}
bdonlan
źródło
10
Lub ... możesz po prostu użyć float i std::numeric_limits<float>::infinity().
Xeo
1
@Xeo, oczywiście, to też jest opcja :)
bdonlan
5

To jest wiadomość dla mnie na przyszłość:

Po prostu użyj: (unsigned)!((int)0)

Tworzy największą możliwą liczbę na dowolnej maszynie, przypisując wszystkie bity do 1 (jedynek), a następnie rzutuje ją na niepodpisane

Nawet lepiej

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

A potem po prostu użyj INF w swoim kodzie

Wilmer E. Henao
źródło
4
Myślę, że masz na myśli #define INF ((unsigned) ~0), spójrz tutaj .
Paul Sanders,
-2

wartości minimalne i maksymalne int

-2.147.483.648 / 2.147.483.647 Int 64-9.223.372.036.854.775.808 / 9.223.372.036.854.775807

myślę, że możesz ustawić a jako równe 9 223 372 036 854 775 807, ale musiałby to być int64

jeśli zawsze chcesz, aby a był tarty, to dlaczego musisz to sprawdzić? po prostu ustaw zawsze tak, aby było prawdziwe

Shaun07776
źródło
1
To zależy od implementacji. W C ++ nie ma „Int64” (chyba że policzysz rzeczy w C ++ 11 cstdint).
Etienne de Martel
@Shaun, aby rozwinąć to, co powiedział Etienne, stackoverflow.com/questions/589575/size-of-int-long-etc wyjaśnia znaczenie inti powiązane typy w C ++.
Mike Samuel
Używałem tylko konstruktora embarcadero c ++ i ma on __int64, nie wiedziałem, że inne c ++ również go nie mają.
Shaun07776