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 起)
(C++23 起为 constexpr)
long double copysignl ( long double mag, long double sgn ) ;
(3) (C++11 起)
(C++23 起为 constexpr)
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 起)
额外重载 (C++11 起)
定义于头文件 <cmath>
template < class Integer >
double copysign ( Integer mag, Integer sgn ) ;
(A) (C++23 起为 constexpr)
1-3) 构造一个浮点数值,其幅值为 mag 的大小,符号为 sgn 的符号。 标准库为所有 cv 未限定浮点类型提供了 std::copysign 的重载,作为参数类型。 (since C++23)
S) SIMD 重载对 v_mag v_sgn 执行逐元素的 std::copysign 操作。
(定义参见 math-common-simd-t
(since C++26)
A) 为所有整数类型提供了额外的重载,这些类型被视为 double
(since C++11)

目录

参数

mag, sgn - 浮点数或整数值

返回值

如果未发生错误,则返回具有 mag 量值和 sgn 符号的浮点数值。

如果 mag 是 NaN,则返回带有 sgn 符号的 NaN。

如果 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)
检查给定数字是否为负数
(函数)
C 文档 for copysign