Namensräume
Varianten
Aktionen

std::copysign, std::copysignf, std::copysignl

Von cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
Definiert in der Header-Datei <cmath>
(1)
float        copysign ( float mag, float sgn );

double      copysign ( double mag, double sgn );

long double copysign ( long double mag, long double sgn );
(bis C++23)
constexpr /*Gleitkommazahl-Typ*/

            copysign ( /*Gleitkommatyp*/ mag,

                       /*Gleitkommatyp*/ sgn );
(seit C++23)
float        copysignf( float mag, float sgn );
(2) (seit C++11)
(constexpr seit C++23)
long double copysignl( long double mag, long double sgn );
(3) (seit C++11)
(constexpr seit C++23)
SIMD-Überladung (seit C++26)
Definiert im Header <simd>
template< class V0, class V1 >

constexpr /*math-common-simd-t*/<V0, V1>

            copysign ( const V0& v_mag, const V1& v_sgn );
(S) (seit C++26)
Definiert in der Header-Datei <cmath>
template< class Integer >
double        copysign ( Integer mag, Integer sgn );
(A) (constexpr seit C++23)
1-3) Erzeugt einen Gleitkommawert mit dem Betrag von mag und dem Vorzeichen von sgn. Die Bibliothek stellt Überladungen von std::copysign für alle cv-unqualifizierten Gleitkommatypen als Parametertypen bereit.(seit C++23)
S) Die SIMD-Überladung führt ein elementweises std::copysign auf v_mag und v_sgn durch.
(Siehe math-common-simd-t für dessen Definition.)
(seit C++26)
A) Zusätzliche Überladungen werden für alle ganzzahligen Typen bereitgestellt, die als double behandelt werden.
(seit C++11)

Inhalt

[edit] Parameter

mag, sgn - Gleitkomma- oder Ganzzahlwerte

[edit] Rückgabewert

Wenn keine Fehler auftreten, wird der Gleitkommawert mit dem Betrag von mag und dem Vorzeichen von sgn zurückgegeben.

Wenn mag NaN ist, wird NaN mit dem Vorzeichen von sgn zurückgegeben.

Wenn sgn -0 ist, ist das Ergebnis nur dann negativ, wenn die Implementierung das vorzeichenbehaftete Null konsistent in arithmetischen Operationen unterstützt.

[edit] Fehlerbehandlung

Diese Funktion unterliegt keinen Fehlern, die in math_errhandling spezifiziert sind.

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

  • Der zurückgegebene Wert ist exakt (FE_INEXACT wird nie ausgelöst) und unabhängig von der aktuellen Rundungsmodus.

[edit] Anmerkungen

std::copysign ist der einzige portable Weg, das Vorzeichen eines NaN-Wertes zu manipulieren (um das Vorzeichen eines NaN zu untersuchen, kann auch std::signbit verwendet werden).

Die zusätzlichen Überladungen müssen nicht exakt wie (A) angegeben werden. Sie müssen nur ausreichen, um sicherzustellen, dass für ihr erstes Argument num1 und ihr zweites Argument num2

  • Wenn num1 oder num2 den Typ long double haben, dann hat std::copysign(num1, num2) die gleiche Wirkung wie std::copysign(static_cast<long double>(num1),
                  static_cast<long double>(num2))
    .
  • Andernfalls, wenn num1 und/oder num2 den Typ double oder einen ganzzahligen Typ haben, dann hat std::copysign(num1, num2) die gleiche Wirkung wie std::copysign(static_cast<double>(num1),
                  static_cast<double>(num2))
    .
  • Andernfalls, wenn num1 oder num2 den Typ float haben, dann hat std::copysign(num1, num2) die gleiche Wirkung wie std::copysign(static_cast<float>(num1),
                  static_cast<float>(num2))
    .
(bis C++23)

Wenn num1 und num2 arithmetische Typen haben, dann hat std::copysign(num1, num2) die gleiche Wirkung wie std::copysign(static_cast</*gemeinsamer Gleitkommatyp*/>(num1),
              static_cast</*gemeinsamer Gleitkommatyp*/>(num2))
, wobei /*gemeinsamer Gleitkommatyp*/ der Gleitkommatyp mit dem höchsten Gleitkomma-Konversionsrang und dem höchsten Gleitkomma-Konversions-Subrang zwischen den Typen von num1 und num2 ist. Argumente vom ganzzahligen Typ werden so betrachtet, als hätten sie den gleichen Gleitkomma-Konversionsrang wie double.

Wenn kein solcher Gleitkommazahltyp mit dem höchsten Rang und Subrang existiert, dann führt die Überladungsauflösung nicht zu einem nutzbaren Kandidaten aus den bereitgestellten Überladungen.

(seit C++23)

[edit] Beispiel

#include <cmath>
#include <iostream>
 
int main()
{
    std::cout << std::showpos
              << "copysign(1.0,+2.0) = " << std::copysign(1.0, +2.0) << '\n'
              << "copysign(1.0,-2.0) = " << std::copysign(1.0, -2.0) << '\n'
              << "copysign(inf,-2.0) = " << std::copysign(INFINITY, -2.0) << '\n'
              << "copysign(NaN,-2.0) = " << std::copysign(NAN, -2.0) << '\n';
}

Ausgabe

copysign(1.0,+2.0) = +1
copysign(1.0,-2.0) = -1
copysign(inf,-2.0) = -inf
copysign(NaN,-2.0) = -nan

[edit] Siehe auch

Absolutwert eines Gleitkommawerts (|x|)
(Funktion) [bearbeiten]
(C++11)
prüft, ob die gegebene Zahl negativ ist
(Funktion) [bearbeiten]
C-Dokumentation für copysign