Göm menyn

Numeriska begränsningar

Inkludera <limits>.

Mallklassen numeric_limits ger information om olika egenskaper för aritmetiska typer och finns specialiserad för följande typer:

float
double
long double
short int
unsigned short int
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
char
wchar_t (endast om implementerad som riktig typ och inte med typedef)
unsigned char
unsigned char
bool (endast om implementerad som riktig typ och inte med typedef)

numeric_limits deklarerar ett stort antal statiska medlemsfunktioner och datamedlemmar. Många av dessa är endast är relevanta för flyttalstyper och i de fall de inte är det har de värdet 0 eller false.

Medlemmar som är meningsfulla för alla specialiseringar

T anger den typ som numeric_limits instansierats för.

T min() Returnerar det minsta värdet för typen T.
T max() Returnerar det största värdet för typen T.
int radix För flyttalstyper anger denna medlem basen eller radix för exponentens representationen (vanligtvis 2). För heltalstyper anger denna medlem basen för representationen.
int  digits Anger antalet radixsiffror som kan representeras. För inbyggda heltalstyper är digits vanligtvis antalet bitar i representationen som ej är teckenbitar. För flyttalstyper är digits antalet radixsiffror i mantissan. Meningsfull om is_bounded är true.
int digits10 Returnerar antalet bas-10-siffror som kan representeras. Meningsfull om is_bounded är true.
bool is_integer Returnerar true om det är en heltalstyp.
bool is_modulo     Returnerar true om modulo-typ. I allmänhet false för flyttalstyper, true för heltalstyper utan tecken (unsigned), och även true för heltalstyper med tecken på de flesta maskiner. För en modulo-typ om det är möjligt att addera två positiva tal och få ett resultat som är mindre.
bool is_signed Returnerar true om typen har tecken.

Det finns fler medlemmar som är meningsfulla för alla specialiseringar.

Medlemmar som är specifika för flyttalstyper

T anger den typ som numeric_limits instansierats för.

T epsilon() Returnerar maskinepsilon, dvs skillnaden mellan 1 och det minsta värde större än 1 som kan representeras för typen T.
T round_error() Returnerar uppskattningen av det maximala avrundningsfelet för typen T.
int max_exponent10 Anger det största positiva heltalet, sådant att 10 upphöjt till detta tal tillhör värdeintervallet.
int min_exponent10 Anger det minsta negativa heltal sådant att 10 upphöjt till detta tal tillhör värdeintervallet.
int min_exponent Anger det minsta negativa heltalet, sådant att radix upphöjt till 1 mindre än detta tal tillhör värdeintervallet.
int max_exponent Anger det största positiva heltalet sådant att radix upphöjt till 1 mindre än detta tal tillhör värdeintervallet.
bool has_infinity Är true om typen (bool) har en representation för positiva oändligheten. Ska vara true för varje typ som följer standarden IEC 559.
bool has_quiet_NaN Är true om typen har en representation för tyst (ej signalerande) Not a Number. Ska vara true för varje typ som följer standarden IEC 559.
bool has_signaling_NaN    Är true om typen har en representation för att ange Not a Number. Ska vara true för varje typ som följer standarden IEC 559.
bool is_iec559 Är true om och endast om typen följer standarden IEC 559.
round_style Anger avrundningssätt för typen: round_indeterminate, round_toward_zero, round_to_nearest (närmast representerbara värde), round_toward_infinity, round_toward_neg_infinity. Specialiseringar för heltal ska returnera round_toward_zero. Hur dessa stilar definieras visas nedan.
infinity() Returnerar representationen för positiva oändligheten, om det finns sådan. Endast meningsfull om has_infinity är true. Krävs för typer som överensstämmer med IEC 559.
quiet_NaN() Returnerar representationen för ett tyst Not a Number om sådan finns för typen T. Endast meningsfull om has_quiet_NaN true. Måste vara meningsfull för typer som följer standarden IEC 559.
signaling_NaN() Returnerar representationen för ett signalerande Not a Number om sådan finns för typen T. Endast meningsfull om has_signaling_NaN är true. Måste vara meningsfull för typer som följer standarden IEC 559.

Det finns ytterligare några medlemmar som är meningsfulla för alla specialiseringar. Avrundningsstilarna för flyttal definieras följande sätt i namnrymnden std:

   enum float_round_style {
      round_indeterminate = -1,
      round_toward_zero = 0,
      round_to_nearest = 1,
      round_toward_infinity = 2,
      round_toward_neg_infinity = 3
   };

För de tre flyttalstyperna float, double och long double finns följande funktioner (inkludera <cmath>):

bool isfinite(x) returnerar true om x har ett ändligt värde, annars false.
bool isinf(x) returnerar true om x är oändligt, annars false.
bool  isnan(x) returnerar true om x är NaN (Not a Number), annars false.
bool isnormal(x) returnerar true om x är normal — dvs varken är noll, subnormal (googla...), oändligt eller NaN (Not a Number) — annars false.
bool isunordered(x, y)    returnerar true om antingen x eller y är NaN (Not a Number), annars false.
int ifpclassify(x) returnerar en av FP_INFINITE, FP_NAN, FP_NORMAL, FP_SUBNORMAL, FP_ZERO som anger kategorin för x. Dessa värden är makron som definieras av implementeringen (inkludera <cmath>).

Exempel för int

#include <iostream>
#include <limits>
using namespace std;
int main()
{
   typedef numeric_limits<int> int_info;
   if (int_info::is_specialized)
   {
      cout << "Info i numeric_limits om int:\n";
      cout << "min.......: " << int_info::min()      << '\n';
      cout << "max.......: " << int_info::max()      << '\n';
      cout << "radix.....: " << int_info::radix      << '\n';
      cout << "digits....: " << int_info::digits     << '\n';
      cout << "digits10..: " << int_info::digits10   << '\n';
      cout << "is signed.: " << int_info::is_signed  << '\n';
      cout << "is integer: " << int_info::is_integer << '\n';
      cout << "is exact..: " << int_info::is_exact   << '\n';
      cout << "traps.....: " << int_info::traps      << '\n';
      cout << "is modulo.: " << int_info::is_modulo  << '\n';
      cout << "is bounded: " << int_info::is_bounded << '\n';
   }
   return 0;
}

Se manualsidan för numeric_limits för mer information (man -s3c++ numeric_limits).


Sidansvarig: Tommy Olsson
Senast uppdaterad: 2012-08-10