跳到主要内容

Copysign

定义于头文件 <cmath> 中。

描述

构成一个浮点值,其大小为 mag,符号为 sgn
该库为所有 cv-unqualified 浮点类型提供了 std::copysign 的重载,作为参数 magsgn 的类型。 (自 C++23 起).

额外的重载适用于所有其他算术类型的组合。

声明

// 1)
constexpr /* floating-point-type */
copysign ( /* floating-point-type */ mag,
/* floating-point-type */ sgn );
// 2)
constexpr float copysignf( float mag, float sgn );
// 3)
constexpr long double copysignl( long double mag, long double sgn );
附加重载
// 4)
template< class Arithmetic1, class Arithmetic2 >
constexpr /* common-floating-point-type */
copysign( Arithmetic1 mag, Arithmetic2 sgn );

参数

mag, sgn - 浮点数或整数值

返回值

如果没有错误发生,则返回大小为 mag、符号为 sgn 的浮点值。

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

如果 sgn-0,则仅当实现支持算术运算中一致的带符号零时,结果才为负数。

错误处理

此函数不受 math_errhandling 中指定的任何错误影响。

如果实现支持 IEEE 浮点运算(IEC 60559

返回值是精确的(FE_INEXACT 永远不会引发),并且独立于当前的舍入模式。

备注

std::copysign 是操作 NaN 值符号的唯一可移植方法(要检查 NaN 的符号,也可以使用std::signbit)。

不需要严格按照 附加重载 提供附加重载。它们只需要足以确保对于它们的第一个参数 num1 和第二个参数 num2

如果 num1num2 的类型是 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))

否则,如果 num1num2 的类型是 float,那么
std::copysign(num1, num2) 与以下效果相同:
std::copysign(static_cast<float>(num1), static_cast<float>(num2))。 (直到 C++23)

如果 num1num2 具有算术类型,则
std::copysign(num1, num2) 与以下效果相同:
std::copysign(static_cast</* common-floating-point-type */>(num1), static_cast</* common-floating-point-type */>(num2)),

其中 /* common-floating-point-type */num1num2 类型之间具有最大浮点转换等级和最大浮点转换子等级的浮点类型,整数类型的参数被认为具有与 double 相同的浮点转换等级。

如果不存在具有最高等级和子等级的浮点类型,则重载决议不会从提供的重载中产生可用的候选。

示例

#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

Copysign

定义于头文件 <cmath> 中。

描述

构成一个浮点值,其大小为 mag,符号为 sgn
该库为所有 cv-unqualified 浮点类型提供了 std::copysign 的重载,作为参数 magsgn 的类型。 (自 C++23 起).

额外的重载适用于所有其他算术类型的组合。

声明

// 1)
constexpr /* floating-point-type */
copysign ( /* floating-point-type */ mag,
/* floating-point-type */ sgn );
// 2)
constexpr float copysignf( float mag, float sgn );
// 3)
constexpr long double copysignl( long double mag, long double sgn );
附加重载
// 4)
template< class Arithmetic1, class Arithmetic2 >
constexpr /* common-floating-point-type */
copysign( Arithmetic1 mag, Arithmetic2 sgn );

参数

mag, sgn - 浮点数或整数值

返回值

如果没有错误发生,则返回大小为 mag、符号为 sgn 的浮点值。

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

如果 sgn-0,则仅当实现支持算术运算中一致的带符号零时,结果才为负数。

错误处理

此函数不受 math_errhandling 中指定的任何错误影响。

如果实现支持 IEEE 浮点运算(IEC 60559

返回值是精确的(FE_INEXACT 永远不会引发),并且独立于当前的舍入模式。

备注

std::copysign 是操作 NaN 值符号的唯一可移植方法(要检查 NaN 的符号,也可以使用std::signbit)。

不需要严格按照 附加重载 提供附加重载。它们只需要足以确保对于它们的第一个参数 num1 和第二个参数 num2

如果 num1num2 的类型是 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))

否则,如果 num1num2 的类型是 float,那么
std::copysign(num1, num2) 与以下效果相同:
std::copysign(static_cast<float>(num1), static_cast<float>(num2))。 (直到 C++23)

如果 num1num2 具有算术类型,则
std::copysign(num1, num2) 与以下效果相同:
std::copysign(static_cast</* common-floating-point-type */>(num1), static_cast</* common-floating-point-type */>(num2)),

其中 /* common-floating-point-type */num1num2 类型之间具有最大浮点转换等级和最大浮点转换子等级的浮点类型,整数类型的参数被认为具有与 double 相同的浮点转换等级。

如果不存在具有最高等级和子等级的浮点类型,则重载决议不会从提供的重载中产生可用的候选。

示例

#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