Namespaces
Variants

std:: modf, std:: modff, std:: modfl

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
modf
(C++11) (C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
Definiert in Header <cmath>
(1)
float modf ( float num, float * iptr ) ;

double modf ( double num, double * iptr ) ;

long double modf ( long double num, long double * iptr ) ;
(bis C++23)
constexpr /* floating-point-type */

modf ( /* floating-point-type */ num,

/* floating-point-type */ * iptr ) ;
(seit C++23)
float modff ( float num, float * iptr ) ;
(2) (seit C++11)
(constexpr seit C++23)
long double modfl ( long double num, long double * iptr ) ;
(3) (seit C++11)
(constexpr seit C++23)
Definiert in Header <cmath>
template < class Integer >
double modf ( Integer num, double * iptr ) ;
(A) (constexpr seit C++23)
1-3) Zerlegt den gegebenen Gleitkommawert num in Ganzzahl- und Nachkommaanteil, wobei jeder Teil denselben Typ und dasselbe Vorzeichen wie num besitzt. Der Ganzzahlanteil (im Gleitkommaformat) wird im Objekt gespeichert, auf das iptr zeigt. Die Bibliothek stellt Überladungen von std::modf für alle cv-unqualifizierten Gleitkommatypen als Typ des Parameters num und des Zeigertyps von iptr bereit. (since C++23)
A) Zusätzliche Überladungen werden für alle Ganzzahltypen bereitgestellt, die als double behandelt werden.
(since C++11)

Inhaltsverzeichnis

Parameter

num - Fließkomma- oder Ganzzahlwert
iptr - Zeiger auf Fließkommawert zum Speichern des ganzzahligen Teils

Rückgabewert

Wenn keine Fehler auftreten, gibt den Bruchteil von num mit demselben Vorzeichen wie num zurück. Der ganzzahlige Teil wird in den Wert geschrieben, auf den iptr zeigt.

Die Summe des zurückgegebenen Werts und des in * iptr gespeicherten Werts ergibt num (unter Berücksichtigung von Rundung).

Fehlerbehandlung

Diese Funktion unterliegt keinen der in math_errhandling spezifizierten Fehlern.

Wenn die Implementierung IEEE-Gleitkommaarithmetik (IEC 60559) unterstützt,

  • Wenn num ±0 ist, wird ±0 zurückgegeben und ±0 wird in * iptr gespeichert.
  • Wenn num ±∞ ist, wird ±0 zurückgegeben und ±∞ wird in * iptr gespeichert.
  • Wenn num NaN ist, wird NaN zurückgegeben und NaN wird in * iptr gespeichert.
  • Der zurückgegebene Wert ist exakt, der aktuelle Rundungsmodus wird ignoriert.

Hinweise

Diese Funktion verhält sich, als wäre sie wie folgt implementiert:

double modf(double num, double* iptr)
{
#pragma STDC FENV_ACCESS ON
    int save_round = std::fegetround();
    std::fesetround(FE_TOWARDZERO);
    *iptr = std::nearbyint(num);
    std::fesetround(save_round);
    return std::copysign(std::isinf(num) ? 0.0 : num - (*iptr), num);
}

Die zusätzlichen Überladungen müssen nicht exakt wie (A) bereitgestellt werden. Sie müssen lediglich sicherstellen, dass für ihr Argument num vom Ganzzahltyp std :: modf ( num, iptr ) dieselbe Wirkung hat wie std :: modf ( static_cast < double > ( num ) , iptr ) .

Beispiel

Vergleicht verschiedene Gleitkomma-Zerlegungsfunktionen:

#include <cmath>
#include <iostream>
#include <limits>
int main()
{
    double f = 123.45;
    std::cout << "Given the number " << f << " or " << std::hexfloat
              << f << std::defaultfloat << " in hex,\n";
    double f3;
    double f2 = std::modf(f, &f3);
    std::cout << "modf() makes " << f3 << " + " << f2 << '\n';
    int i;
    f2 = std::frexp(f, &i);
    std::cout << "frexp() makes " << f2 << " * 2^" << i << '\n';
    i = std::ilogb(f);
    std::cout << "logb()/ilogb() make " << f / std::scalbn(1.0, i) << " * "
              << std::numeric_limits<double>::radix
              << "^" << std::ilogb(f) << '\n';
    // special values
    f2 = std::modf(-0.0, &f3);
    std::cout << "modf(-0) makes " << f3 << " + " << f2 << '\n';
    f2 = std::modf(-INFINITY, &f3);
    std::cout << "modf(-Inf) makes " << f3 << " + " << f2 << '\n';
}

Mögliche Ausgabe:

Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
modf(-0) makes -0 + -0
modf(-Inf) makes -INF + -0

Siehe auch

(C++11) (C++11) (C++11)
nächstgelegene Ganzzahl, die nicht größer im Betrag als der gegebene Wert ist
(Funktion)