std::numeric limits
Főnév
std::numeric limits (tsz. std::numeric limitses)
- (informatika) A
std::numeric_limitsosztály sablon a C++ standard könyvtárának egy fontos része, amely lehetővé teszi számunkra, hogy egy adott numerikus típus (példáulint,double,float, stb.) különböző jellemzőit lekérdezzük futásidő nélkül, fordítási időben. Ez különösen hasznos lehet akkor, amikor egy adott típussal való műveleteinket pontosabbá, biztonságosabbá vagy optimalizáltabbá szeretnénk tenni.
A std::numeric_limits általános működése
A std::numeric_limits<T> osztály egy sablon, amely a T típusra vonatkozó statikus függvényeket és konstansokat biztosít. Ezek a konstansok és függvények az adott típus legkisebb és legnagyobb értékeit, pontossági határait, lebegőpontos ábrázolás jellemzőit és egyéb matematikai tulajdonságait írják le.
A std::numeric_limits sablont a <limits> fejléccel kell inkludálni:
#include <iostream>
#include <limits>
int main() {
std::cout << "int max: " << std::numeric_limits<int>::max() << '\n';
std::cout << "int min: " << std::numeric_limits<int>::min() << '\n';
return 0;
}
Ez a program kiírja az int típus legnagyobb és legkisebb értékét.
A std::numeric_limits fontosabb tagjai
A következő tagokat és tulajdonságokat lehet lekérdezni a std::numeric_limits segítségével:
1. Értékkorlátok
| Tulajdonság | Leírás |
|---|---|
max() |
A típus maximális értéke |
min() |
A típus minimális pozitív értéke (nem előjeles esetén a legkisebb érték) |
lowest() |
A legkisebb lehetséges érték (előjeles típusoknál fontos) |
Példa:
#include <iostream>
#include <limits>
int main() {
std::cout << "double max: " << std::numeric_limits<double>::max() << '\n';
std::cout << "double min: " << std::numeric_limits<double>::min() << '\n';
std::cout << "double lowest: " << std::numeric_limits<double>::lowest() << '\n';
return 0;
}
Ez a kód kiírja a double típus maximális, minimális és legkisebb negatív értékét.
2. Előjel és előjel nélküli típusok megkülönböztetése
| Tulajdonság | Leírás |
|---|---|
is_signed |
true, ha az adott típus előjeles |
is_integer |
true, ha az adott típus egész szám |
is_exact |
true, ha az adott típusnak nincs pontossági hibája |
Példa:
#include <iostream>
#include <limits>
int main() {
std::cout << "Az int előjeles? " << std::numeric_limits<int>::is_signed << '\n';
std::cout << "Az int egész típus? " << std::numeric_limits<int>::is_integer << '\n';
std::cout << "A float pontos értéket tud tárolni? " << std::numeric_limits<float>::is_exact << '\n';
return 0;
}
3. Precizitás és pontosság lebegőpontos számoknál
| Tulajdonság | Leírás |
|---|---|
epsilon() |
A legkisebb különbség 1 és egy nála nagyobb érték között |
digits |
Az adott típus bitpontossága (pl. float esetén 24) |
radix |
A számrendszer alapja (általában 2, bináris számrendszer miatt) |
Példa:
#include <iostream>
#include <limits>
int main() {
std::cout << "A float epsilon értéke: " << std::numeric_limits<float>::epsilon() << '\n';
std::cout << "A float bitszáma: " << std::numeric_limits<float>::digits << '\n';
return 0;
}
4. Különleges értékek és tulajdonságok
| Tulajdonság | Leírás |
|---|---|
has_infinity |
true, ha a típusnak van végtelen értéke |
infinity() |
Az adott típus végtelen értéke |
has_quiet_NaN |
true, ha van „csendes” NaN (Not a Number) |
quiet_NaN() |
Egy csendes NaN érték |
has_denorm |
Megmutatja, hogy van-e denormalizált szám támogatás |
Példa:
#include <iostream>
#include <limits>
int main() {
std::cout << "A double támogatja a végtelent? " << std::numeric_limits<double>::has_infinity << '\n';
std::cout << "A double végtelen értéke: " << std::numeric_limits<double>::infinity() << '\n';
return 0;
}
Ez a kód megmutatja, hogy a double típus támogatja-e a végtelent, és ha igen, akkor kiírja a végtelen értéket.
Gyakorlati felhasználások
Túlcsordulás elkerülése
Ha biztosak akarunk lenni abban, hogy egy változó nem lép túl a határain, használhatjuk amax()ésmin()függvényeket:int x = std::numeric_limits<int>::max(); if (x + 1 < x) { std::cout << "Túlcsordulás történt!\n"; }
Numerikus stabilitás biztosítása
Ha lebegőpontos számokkal dolgozunk, azepsilon()segíthet a kerekítési hibák kezelésében:double a = 1.0; double b = a + std::numeric_limits<double>::epsilon(); if (a != b) { std::cout << "A két érték különbözik!\n"; }
Határértékek beállítása a programban
Amikor egy program különböző adattípusokkal dolgozik, astd::numeric_limitssegíthet a helyes tartományok meghatározásában.
Összegzés
A std::numeric_limits egy erőteljes eszköz a C++ nyelvben, amely lehetővé teszi számunkra, hogy különböző numerikus típusok tulajdonságait statikus módon vizsgáljuk meg. Segít az adattípusok határainak ellenőrzésében, a kerekítési hibák elkerülésében és a numerikus számítások stabilabbá tételében.
- std::numeric limits - Szótár.net (en-hu)
- std::numeric limits - Sztaki (en-hu)
- std::numeric limits - Merriam–Webster
- std::numeric limits - Cambridge
- std::numeric limits - WordNet
- std::numeric limits - Яндекс (en-ru)
- std::numeric limits - Google (en-hu)
- std::numeric limits - Wikidata
- std::numeric limits - Wikipédia (angol)