2011-12-31 26 views
79

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ć?

+0

Można po prostu użyć 'float's, które mają wartość reprezentującą nieskończoność. – Xeo

+3

Cóż, potrzebujesz czegoś podobnego do nieskończoności, aby zaimplementować podstawowy przykład algorytmu Dijkstra. – jozefg

+1

@jozefg - Okay, więc nie jest to sprawdzanie, którego oczekuje użytkownik, tylko implementacja języka "Max Value". – keyboardP

Odpowiedz

48

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 .

+4

... 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 :: has_infinity' i poza tym 'min()' i 'max()' –

91

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(); 
+28

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". –

+0

@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. –

+3

Dodałem komentarz dla przyszłych użytkowników, którzy nie implementują algorytmu Dijkstry, ale potrzebują go do czegoś innego. :) –

11

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 
} 
+9

* Lub * ... możesz po prostu użyć float i 'std :: numeric_limits :: infinity()'. – Xeo

+0

@Xeo, na pewno, to też opcja :) – bdonlan

-2

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

+1

To zależy od implementacji. Nie ma "Int64" w C++ (chyba że policzycie rzeczy w C++ 'cstdint'). –

+0

@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++. –

+0

Użyłem tylko embarcadero C++ builder i ma on __int64, nie wiedziałem, że inne C++ też go nie ma. – Shaun07776

1

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