Namensräume
Varianten
Aktionen

round, roundf, roundl, lround, lroundf, lroundl, llround, llroundf, llroundl

Von cppreference.com
< c‎ | numerik‎ | math
 
 
 
Allgemeine mathematische Funktionen
Funktionen
Grundlegende Operationen
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
Maximum/Minimum-Operationen
(C99)
(C99)
Exponentialfunktionen
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
Potenzfunktionen
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
Trigonometrische und hyperbolische Funktionen
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
Nächste ganze Gleitkommazahlen
roundlroundllround
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
Gleitkomma-Manipulation
(C99)(C99)
(C99)(C23)
(C99)
Verengende Operationen
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quanten- und Quantenexponent-Funktionen
Dezimal-Neu-Kodierungsfunktionen
Gesamtordnung und Payload-Funktionen
Klassifizierung
(C99)
(C99)
(C99)
(C23)
Fehler- und Gammafunktionen
(C99)
(C99)
(C99)
(C99)
Typen
Makrokonstanten
Spezielle Gleitkommawerte
(C99)(C23)
Argumente und Rückgabewerte
Fehlerbehandlung
Schnelle Operationsanzeigen
 
Definiert in Header <math.h>
float       roundf( float arg );
(1) (seit C99)
double      round( double arg );
(2) (seit C99)
long double roundl( long double arg );
(3) (seit C99)
Definiert in Header <tgmath.h>
#define round( arg )
(4) (seit C99)
Definiert in Header <math.h>
long      lroundf( float arg );
(5) (seit C99)
long      lround( double arg );
(6) (seit C99)
long      lroundl( long double arg );
(7) (seit C99)
Definiert in Header <tgmath.h>
#define lround( arg )
(8) (seit C99)
Definiert in Header <math.h>
long long llroundf( float arg );
(9) (seit C99)
long long llround( double arg );
(10) (seit C99)
long long llroundl( long double arg );
(11) (seit C99)
Definiert in Header <tgmath.h>
#define llround( arg )
(12) (seit C99)
1-3) Berechnet den nächstgelegenen ganzzahligen Wert zu arg (im Gleitkommaformat) und rundet dabei zur Hälfte weg vom Nullpunkt, unabhängig vom aktuellen Rundungsmodus.
5-7, 9-11) Berechnet den nächstgelegenen ganzzahligen Wert zu arg (im Ganzzahlformat) und rundet dabei zur Hälfte weg vom Nullpunkt, unabhängig vom aktuellen Rundungsmodus.
4,8,12) Typspezifische Makros: Wenn arg den Typ long double hat, wird roundl, lroundl, llroundl aufgerufen. Andernfalls, wenn arg einen ganzzahligen Typ oder den Typ double hat, wird round, lround, llround aufgerufen. Andernfalls wird entsprechend roundf, lroundf, llroundf aufgerufen.

Inhalt

[edit] Parameter

arg - Gleitkommawert

[edit] Rückgabewert

Wenn keine Fehler auftreten, wird der nächstgelegene ganzzahlige Wert zu arg zurückgegeben, wobei die Hälfte der Fälle vom Nullpunkt weg gerundet wird.

Rückgabewert
math-round away zero.svg
Argument

Wenn ein Domänenfehler auftritt, wird ein implementierungsdefinierter Wert zurückgegeben.

[edit] Fehlerbehandlung

Fehler werden wie in math_errhandling angegeben gemeldet.

Wenn das Ergebnis von lround oder llround außerhalb des durch den Rückgabetyp darstellbaren Bereichs liegt, kann ein Domänenfehler oder ein Bereichsfehler auftreten.

Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt

Für die Funktionen round, roundf und roundl
  • Der aktuelle Rundungsmodus hat keine Auswirkung.
  • Wenn arg ±∞ ist, wird es unverändert zurückgegeben.
  • Wenn arg ±0 ist, wird es unverändert zurückgegeben.
  • Wenn arg NaN ist, wird NaN zurückgegeben.
Für die Funktionsfamilien lround und llround
  • FE_INEXACT wird niemals ausgelöst.
  • Der aktuelle Rundungsmodus hat keine Auswirkung.
  • Wenn arg ±∞ ist, wird FE_INVALID ausgelöst und ein implementierungsdefinierter Wert zurückgegeben.
  • Wenn das Ergebnis der Rundung außerhalb des Bereichs des Rückgabetyps liegt, wird FE_INVALID ausgelöst und ein implementierungsdefinierter Wert zurückgegeben.
  • Wenn arg NaN ist, wird FE_INVALID ausgelöst und ein implementierungsdefinierter Wert zurückgegeben.

[edit] Anmerkungen

FE_INEXACT kann (muss aber nicht) von round ausgelöst werden, wenn eine nicht-ganzzahlige endliche Zahl gerundet wird.

Die größten darstellbaren Gleitkommazahlen sind exakte ganze Zahlen in allen standardmäßigen Gleitkommaformaten, daher überläuft round allein nie; das Ergebnis kann jedoch jeden Ganzzahltyp (einschließlich intmax_t) überlaufen, wenn es in einer Ganzzahlvariable gespeichert wird.

POSIX gibt an, dass alle Fälle, in denen lround oder llround FE_INVALID auslösen, Domänenfehler sind.

Die double-Version von round verhält sich so, als würde sie wie folgt implementiert:

#include <math.h>
#pragma STDC FENV_ACCESS ON
 
double round(double x)
{
    return signbit(x) ? ceil(x - 0.5) : floor(x + 0.5);
}

[edit] Beispiel

#include <assert.h>
#include <fenv.h>
#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
 
double custom_round(double x)
{
    return signbit(x) ? ceil(x - 0.5) : floor(x + 0.5);
}
 
void test_custom_round()
{
    const double sample[] =
    {
        0.0, 2.3, 2.5 - DBL_EPSILON, 2.5, 2.5 + DBL_EPSILON, 2.7, INFINITY
    };
    for (size_t t = 0; t < sizeof sample / sizeof(double); ++t)
        assert(round(+sample[t]) == custom_round(+sample[t]) &&
               round(-sample[t]) == custom_round(-sample[t]));
}
 
int main(void)
{
    // round
    printf("round(+2.3) = %+.1f  ", round(2.3));
    printf("round(+2.5) = %+.1f  ", round(2.5));
    printf("round(+2.7) = %+.1f\n", round(2.7));
    printf("round(-2.3) = %+.1f  ", round(-2.3));
    printf("round(-2.5) = %+.1f  ", round(-2.5));
    printf("round(-2.7) = %+.1f\n", round(-2.7));
 
    printf("round(-0.0) = %+.1f\n", round(-0.0));
    printf("round(-Inf) = %+f\n",   round(-INFINITY));
 
    test_custom_round();
 
    // lround
    printf("lround(+2.3) = %+ld  ", lround(2.3));
    printf("lround(+2.5) = %+ld  ", lround(2.5));
    printf("lround(+2.7) = %+ld\n", lround(2.7));
    printf("lround(-2.3) = %+ld  ", lround(-2.3));
    printf("lround(-2.5) = %+ld  ", lround(-2.5));
    printf("lround(-2.7) = %+ld\n", lround(-2.7));
 
    printf("lround(-0.0) = %+ld\n", lround(-0.0));
    printf("lround(-Inf) = %+ld\n", lround(-INFINITY)); // FE_INVALID raised
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("lround(LONG_MAX+1.5) = %ld\n", lround(LONG_MAX + 1.5));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID was raised");
}

Mögliche Ausgabe

round(+2.3) = +2.0  round(+2.5) = +3.0  round(+2.7) = +3.0
round(-2.3) = -2.0  round(-2.5) = -3.0  round(-2.7) = -3.0
round(-0.0) = -0.0
round(-Inf) = -inf
lround(+2.3) = +2  lround(+2.5) = +3  lround(+2.7) = +3
lround(-2.3) = -2  lround(-2.5) = -3  lround(-2.7) = -3
lround(-0.0) = +0
lround(-Inf) = -9223372036854775808
lround(LONG_MAX+1.5) = -9223372036854775808
    FE_INVALID was raised

[edit] Referenzen

  • C23-Standard (ISO/IEC 9899:2024)
  • 7.12.9.6 The round functions (p: TBD)
  • 7.12.9.7 The lround and llround functions (p: TBD)
  • 7.25 Typ-generische Mathematik <tgmath.h> (S. TBD)
  • F.10.6.6 The round functions (p: TBD)
  • F.10.6.7 The lround and llround functions (p: TBD)
  • C17-Standard (ISO/IEC 9899:2018)
  • 7.12.9.6 The round functions (p: 184)
  • 7.12.9.7 The lround and llround functions (p: 184-185)
  • 7.25 Typ-generische Mathematik <tgmath.h> (S. 272-273)
  • F.10.6.6 The round functions (p: 384)
  • F.10.6.7 The lround and llround functions (p: 385)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.12.9.6 The round functions (p: 253)
  • 7.12.9.7 The lround and llround functions (p: 253)
  • 7.25 Typ-generische Mathematik <tgmath.h> (S. 373-375)
  • F.10.6.6 The round functions (p: 527)
  • F.10.6.7 The lround and llround functions (p: 528)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.12.9.6 The round functions (p: 233)
  • 7.12.9.7 The lround and llround functions (p: 234)
  • 7.22 Typ-generische Mathematik <tgmath.h> (S. 335-337)
  • F.9.6.6 The round functions (p: 464)
  • F.9.6.7 The lround and llround functions (p: 464)

[edit] Siehe auch

berechnet die größte ganze Zahl, die nicht größer als der gegebene Wert ist
(Funktion) [bearbeiten]
(C99)(C99)
berechnet die kleinste ganze Zahl, die nicht kleiner als der gegebene Wert ist
(Funktion) [bearbeiten]
(C99)(C99)(C99)
rundet auf die größte ganze Zahl, deren Betrag nicht größer als der gegebene Wert ist
(Funktion) [bearbeiten]