Spec-Zone.ru › C++

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

Определено в заголовке <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)
Дополнительные перегрузки (с C++11)
Определено в заголовке <cmath>
template< class Integer >
double      copysign ( Integer mag, Integer sgn );
(A) (constexpr с C++23)
1-3) Комбинирует значение с плавающей точкой с модулем mag и знаком sgn. Библиотека предоставляет перегрузки std::copysign для всех типов с плавающей точкой без квалификаторов cv в качестве типа параметров.(с C++23)
A) Дополнительные перегрузки предоставляются для всех целочисленных типов, которые обрабатываются как double. (с C++11)

Параметры

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

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

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

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

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

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

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

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

  • Возвращаемое значение точное (FE_INEXACT никогда не поднимается) и не зависит от текущего режима округления.

Примечания

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

См. также

abs(float)fabsfabsffabsl
(C++11)(C++11)
абсолютное значение значения с плавающей точкой (\(\small{|x|}\)|x|)
(функция)
signbit
(C++11)
проверяет, является ли заданное число отрицательным
(функция)
Документация на C для copysign

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/math/copysign

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API