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();
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 hereint 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.
... 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:
float
s, które mają wartość reprezentującą nieskończoność.Max Value
implementację języka.a>b
kontrolę :)Odpowiedzi:
Liczby całkowite są z natury skończone. Najbliżej można dostać się poprzez ustawienie
a
naint
„s wartości maksymalnej:Który byłby
2^31 - 1
(lub2 147 483 647
) jeśliint
ma 32 bity szerokości w twojej implementacji.Jeśli naprawdę potrzebujesz nieskończoności, użyj liczb zmiennoprzecinkowych, takich jak
float
lubdouble
. Możesz wtedy uzyskać nieskończoność za pomocą:źródło
int
rozwiązania, musisz bardzo uważać na arytmetykę: dodanie liczby dodatniej do „nieskończoności” da bardzo nieoczekiwany wynik.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 .:
jest zawsze prawdą.
Zrobiłbyś to przez
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ć
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.
źródło
max()
lubinfinity()
w szablonie, w którym typ numeryczny jest nieznany, będziesz musiał użyć+/-infinity()
iffstd::numeric_limits<T>::has_infinity
lub innegomin()
imax()
int
jest 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:źródło
std::numeric_limits<float>::infinity()
.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
A potem po prostu użyj INF w swoim kodzie
źródło
#define INF ((unsigned) ~0)
, spójrz tutaj .Możesz także użyć INT_MAX:
http://www.cplusplus.com/reference/climits/
jest to równoważne użyciu numeric_limits.
źródło
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
źródło
cstdint
).int
i powiązane typy w C ++.