numeric_limits

18 listopada 2008

Standardowa biblioteka języka C++ zawiera wiele ciekawych i przydatnych narzędzi w codziennej pracy developera C++, a po wejściu w życie C++0x będzie jeszcze ciekawiej. Czasem nawet nie mamy świadomości lub zapominamy o ciekawych perełkach jakie można tam znaleźć.

Jednym z zapomnianych i chyba rzadko używanych komponentów biblioteki STL jest szablon numeric_limits będący „odłamkiem” numerycznej części biblioteki. Wzorzec ten wraz z specjalizacjami dla typów wbudowanych zdefiniowany jest w pliku nagłówkowym limits. Jego przeznaczeniem jest dostarczenie informacji o cechach typów numerycznych.

Do „wyciągnięcia” właściwości typu wystarczy użyć tego wzorca sparametryzowanego danym typem. Na przykład łatwo możemy dowiedzieć się jakie minimalne i maksymalne wartości liczbowe dany typ może zmieścić:

using namespace std;
 
cout << "min(int):          " << numeric_limits<int>::min() << endl;
cout << "max(int):          " << numeric_limits<int>::max() << endl;
 
cout << "min(unsigned int): " << numeric_limits<unsigned int>::min() << endl;
cout << "max(unsigned int): " << numeric_limits<unsigned int>::max() << endl;
 
cout << "min(long):         " << numeric_limits<long>::min() << endl;
cout << "max(long):         " << numeric_limits<long>::max() << endl;
 
cout << "min(float):        " << numeric_limits<float>::min() << endl;
cout << "max(float):        " << numeric_limits<float>::max() << endl;

w wyniku czego otrzymamy interesujące nas dane:

min(int):          -2147483648
max(int):          2147483647
min(unsigned int): 0
max(unsigned int): 4294967295
min(long):         -2147483648
max(long):         2147483647
min(float):        1.17549e-38
max(float):        3.40282e+38

Oczywiście min i max to tylko czubek góry lodowej, numeric_limits zawiera dużo więcej informacji, nie będę ich tutaj przytaczał, można je znaleźć w dowolnej dokumentacji STL-a.

Rzeczą nie wymagającą chyba wspomnienia jest to, iż dla typów zdefiniowanych przez użytkownika, czyli naszych typów, powinniśmy dostarczy skonkretyzowane dla tych typów wersje wzorca numeric_limits, jeśli przewidujemy jego wykorzystanie z tymi typami.

W zamierzeniu, tak jak funkcje inline i wzorce, numeric_limits miał zastąpić uzywanie niebezpiecznych makr określających maksymalne i minimalne wartości dla niektórych typów, jak chociażby makra INT_MIN, INT_MAX. Jak widać udało się to z nawiązką, numeric_limits dostarcza o wiele więcej pożytecznych informacji o typach.

Podobne notatki:

Może zainteresują Cię również następujące, pododbne notatki:

Komentarze i nawiązania (2)

Kanał RSS komentarzy

  1. [...] numeric_limits [...]

  2. [...] o numeric_limits jako zapomnianej części biblioteki numerycznej, dziś do tego “worka” mogę dorzucić [...]

Dodaj swój komentarz

Możesz użyć tych tagów XHTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Jeśli chcesz wstawić kilku linijkowy fragment kodu, użyj tagów <pre lang="x"></pre> (gdzie x język kodu np. cpp, perl, html). W ten sposób kod zostanie odpowiednio sformatowany i pokolorowany przez system.

Uwaga!

Na tym blogu działa system cache oraz filtr antyspamowy. Twój komentarz może być widoczny na stronie z pewnym opóźnieniem. Proszę o cierpliwość. Jeśli utraciłeś już wszystkie jej zasoby poinformuj mnie o tym, być może system uznał Cię za spamera ;)