Mam int a
, który musi być równy "nieskończoności". Oznacza to, że jeśli zawsze jest prawdziwe, to zawsze jest prawdziwe.Ustawienie int na Infinity w C++
Czy jest jakaś cecha języka C++, która mogłaby to umożliwić?
Mam int a
, który musi być równy "nieskończoności". Oznacza to, że jeśli zawsze jest prawdziwe, to zawsze jest prawdziwe.Ustawienie int na Infinity w C++
Czy jest jakaś cecha języka C++, która mogłaby to umożliwić?
Liczba całkowita jest skończona, więc niestety nie można ustawić jej w prawdziwej nieskończoności. Jednak można ustawić go do max wartości int, oznaczałoby to, że będzie większa lub równa każdej innej int, czyli:
a>=b
jest zawsze prawdziwa.
byłoby to zrobić przez
#include <limits>
//your code here
int a = std::numeric_limits<int>::max();
//go off and lead a happy and productive life
to normalnie będzie równa 2,147,483,647
Jeśli naprawdę potrzebujesz prawdziwego „nieskończoną” wartość, trzeba by użyć podwójnych lub pływaka. Następnie można po prostu zrobić to
float a = std::numeric_limits<float>::infinity();
Dodatkowe wyjaśnienia limitów liczbowych można znaleźć here
Szczęśliwy Coding!
Uwaga: Jak wspomniano WTP, jeśli absolutnie konieczne jest posiadanie int, które jest "nieskończone", musielibyśmy napisać klasę wrapper dla int i przeciążyć operatory porównania, choć prawdopodobnie nie jest to konieczne dla większości projektów .
... a jeśli chcesz użyć 'max()' lub 'infinity()' w szablonie, w którym numeryczny typ jest nieznany, będziesz musiał użyć '+/- infinity()' iff 'std :: numeric_limits
Liczby całkowite są z natury skończone. Najbliżej można dostać się poprzez ustawienie a
do maksymalnej wartości int
„s:
#include <limits>
// ...
int a = std::numeric_limits<int>::max();
Który byłby 2^31 - 1
(lub 2 147 483 647
) jeżeli int
wynosi 32 bitów szerokości od implementacji.
Jeśli potrzebujesz naprawdę potrzebujesz nieskończoności, użyj liczby zmiennoprzecinkowej, np. float
lub double
. Można wtedy uzyskać nieskończoność z:
double a = std::numeric_limits<double>::infinity();
A jeśli * naprawdę * potrzebujesz nieskończoności jako ** int **, napisz klasę opakowującą, która obciąży 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ę, że byłoby to konieczne. Ale w przeciwnym razie jest to najrozsądniejszy wybór. –
Dodałem komentarz dla przyszłych użytkowników, którzy nie implementują algorytmu Dijkstry, ale potrzebują go do czegoś innego. :) –
int
natury jest skończony; nie ma żadnej wartości spełniającej twoje wymagania.
Jeśli jesteś gotów zmienić typ b
, choć można to zrobić z zadajnikami operatorskich:
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
}
int min i max wartości
Int -2147483648/2147483647 Int 64 -9.223.372.036.854.775.808/9.223.372.036.854.775.807
Chyba można ustawić na równej 9,223,372,036,854,775,807 ale musiałaby być Int64
jeśli zawsze chcesz być lepszym tym, dlaczego musisz go sprawdzać? po prostu ustaw to, aby było prawdziwe zawsze
To zależy od implementacji. Nie ma "Int64" w C++ (chyba że policzycie rzeczy w C++ 'cstdint'). –
@Shaun, aby rozwinąć to, co powiedział Etienne, http://stackoverflow.com/questions/589575/size-of-int-long-etc wyjaśnia znaczenie "int" i powiązanych typów w C++. –
Użyłem tylko embarcadero C++ builder i ma on __int64, nie wiedziałem, że inne C++ też go nie ma. – Shaun07776
Można również użyć INT_MAX:
http://www.cplusplus.com/reference/climits/
to równoważne użyciu numeric_limits.
To jest wiadomość dla mnie w przyszłości:
Wystarczy użyć: (unsigned) ((int) 0)
Tworzy możliwie największą liczbę w każdej maszynie poprzez przypisanie wszystkich bitów 1s (z nich), a następnie rzuca go do unsigned
jeszcze lepiej
#define INF (unsigned)!((int)0)
i po prostu użyć INF poniżej
Można po prostu użyć 'float's, które mają wartość reprezentującą nieskończoność. – Xeo
Cóż, potrzebujesz czegoś podobnego do nieskończoności, aby zaimplementować podstawowy przykład algorytmu Dijkstra. – jozefg
@jozefg - Okay, więc nie jest to sprawdzanie, którego oczekuje użytkownik, tylko implementacja języka "Max Value". – keyboardP