std::numeric limits (tsz. std::numeric limitses)
std::numeric_limits
osztá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ául int
, 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.
std::numeric_limits
általános működéseA 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.
std::numeric_limits
fontosabb tagjaiA következő tagokat és tulajdonságokat lehet lekérdezni a std::numeric_limits
segítségével:
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.
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;
}
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;
}
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.
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 a max()
és min()
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, az epsilon()
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, a std::numeric_limits
segíthet a helyes tartományok meghatározásában.
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.