Namespaces
Variants

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

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)
(C++11) (C++11)
copysign
(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
Определено в заголовочном файле <cmath>
(1)
float copysign ( float mag, float sgn ) ;

double copysign ( double mag, double sgn ) ;

long double copysign ( long double mag, long double sgn ) ;
(до C++23)
constexpr /*floating-point-type*/

copysign ( /*floating-point-type*/ mag,

/*floating-point-type*/ sgn ) ;
(начиная с C++23)
float copysignf ( float mag, float sgn ) ;
(2) (начиная с C++11)
(constexpr начиная с C++23)
long double copysignl ( long double mag, long double sgn ) ;
(3) (начиная с C++11)
(constexpr начиная с C++23)
SIMD перегрузка (начиная с C++26)
Определено в заголовочном файле <simd>
template < class V0, class V1 >

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

copysign ( const V0 & v_mag, const V1 & v_sgn ) ;
(S) (начиная с C++26)
Определено в заголовочном файле <cmath>
template < class Integer >
double copysign ( Integer mag, Integer sgn ) ;
(A) (constexpr начиная с C++23)
1-3) Формирует значение с плавающей точкой с величиной mag и знаком sgn . Библиотека предоставляет перегрузки std::copysign для всех неквалифицированных cv типов с плавающей точкой в качестве типа параметров. (начиная с C++23)
S) Перегрузка SIMD выполняет поэлементное применение std::copysign к v_mag и v_sgn .
(См. math-common-simd-t для его определения.)
(since C++26)
A) Дополнительные перегрузки предоставляются для всех целочисленных типов, которые трактуются как double .
(since C++11)

Содержание

Параметры

mag, sgn - значения с плавающей точкой или целочисленные значения

Возвращаемое значение

Если ошибок не возникает, возвращается значение с плавающей точкой с величиной mag и знаком sgn .

Если mag является NaN, то возвращается NaN со знаком sgn .

Если sgn равно -0, результат будет отрицательным только в том случае, если реализация последовательно поддерживает знаковый ноль в арифметических операциях.

Обработка ошибок

Эта функция не подвержена никаким ошибкам, указанным в math_errhandling .

Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559),

Примечания

std::copysign — это единственный переносимый способ управления знаком значения NaN (для проверки знака NaN также может использоваться std::signbit ).

Дополнительные перегрузки не обязаны быть предоставлены в точности как (A) . Они должны быть лишь достаточными для обеспечения того, чтобы для их первого аргумента num1 и второго аргумента num2 :

  • Если num1 или num2 имеет тип long double , то std :: copysign ( num1, num2 ) имеет тот же эффект, что и std :: copysign ( static_cast < long double > ( num1 ) ,
    static_cast < long double > ( num2 ) )
    .
  • В противном случае, если num1 и/или num2 имеет тип double или целочисленный тип, то std :: copysign ( num1, num2 ) имеет тот же эффект, что и std :: copysign ( static_cast < double > ( num1 ) ,
    static_cast < double > ( num2 ) )
    .
  • В противном случае, если num1 или num2 имеет тип float , то std :: copysign ( num1, num2 ) имеет тот же эффект, что и std :: copysign ( static_cast < float > ( num1 ) ,
    static_cast < float > ( num2 ) )
    .
(до C++23)

Если num1 и num2 имеют арифметические типы, то std :: copysign ( num1, num2 ) имеет тот же эффект, что и std :: copysign ( static_cast < /*common-floating-point-type*/ > ( num1 ) ,
static_cast < /*common-floating-point-type*/ > ( num2 ) )
, где /*common-floating-point-type*/ - это тип с плавающей запятой с наибольшим рангом преобразования с плавающей запятой и наибольшим подрангом преобразования с плавающей запятой среди типов num1 и num2 , при этом аргументы целочисленного типа считаются имеющими тот же ранг преобразования с плавающей запятой, что и double .

Если такого типа с плавающей запятой с наибольшим рангом и подрангом не существует, то разрешение перегрузки не приводит к пригодному кандидату из предоставленных перегрузок.

(начиная с C++23)

Пример

#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';
}

Вывод:

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

Смотрите также

абсолютное значение числа с плавающей точкой ( |x| )
(функция)
(C++11)
проверяет, является ли данное число отрицательным
(функция)