diff --git a/reference/cmath/copysign.md b/reference/cmath/copysign.md index b4679ea14a..e31b2c84b3 100644 --- a/reference/cmath/copysign.md +++ b/reference/cmath/copysign.md @@ -64,6 +64,7 @@ namespace std { ## 備考 - 符号付きゼロを表現するが負のゼロを取り扱わない実装では、この関数はゼロを正と見なす。 +- 浮動小数点数の符号ビットを検出したい場合は、[`std::signbit`](/reference/cmath/signbit.md)を使用できる。`NaN`の符号を検出できる移植性のある方法はこの2つのみである。 - C++23では、(1), (2), (3)が(4)に統合され、拡張浮動小数点数型を含む浮動小数点数型へのオーバーロードとして定義された @@ -71,22 +72,40 @@ namespace std { ```cpp example #include #include +#include int main() { - float result1 = std::copysign(1.0f, 2.0f); - float result2 = std::copysign(1.0f, -2.0f); - - std::cout << result1 << std::endl; - std::cout << result2 << std::endl; + // 通常の数値 + std::cout << "1.0f, 2.0f : " << std::copysign(1.0f, 2.0f) << std::endl; + std::cout << "0.0f, -2.0f : " << std::copysign(0.0f, -2.0f) << std::endl; + std::cout << "1.5f, -0.0f : " << std::copysign(1.5f, -0.0f) << std::endl; + + // 無限大 + const float inf = std::numeric_limits::infinity(); + std::cout << "-inf, 3.0f : " << std::copysign(-inf, 3.0f) << std::endl; + std::cout << "3.0f, -inf : " << std::copysign(3.0f, -inf) << std::endl; + + // NaN (Not a Number) + // NaNの符号もコピーされる。 + const float nan = std::numeric_limits::quiet_NaN(); + std::cout << " nan, -4.2f : " << std::copysign(nan, -4.2f) << std::endl; + std::cout << "4.2f, -nan : " << std::copysign(4.2f, -nan) << std::endl; } ``` * std::copysign[color ff0000] +* infinity()[link /reference/limits/numeric_limits/infinity.md] +* quiet_NaN()[link /reference/limits/numeric_limits/quiet_nan.md] ### 出力 ``` -1 --1 +1.0f, 2.0f : 1 +0.0f, -2.0f : -0 +1.5f, -0.0f : -1.5 +-inf, 3.0f : inf +3.0f, -inf : -3 + nan, -4.2f : -nan +4.2f, -nan : -4.2 ``` ### 備考 diff --git a/reference/cmath/signbit.md b/reference/cmath/signbit.md index 9689541eac..4b575c401f 100644 --- a/reference/cmath/signbit.md +++ b/reference/cmath/signbit.md @@ -45,26 +45,46 @@ namespace std { ## 例 ```cpp example -#include +#include #include +#include int main() { - assert(std::signbit(-1.0f)); - assert(std::signbit(-0.0f)); - - assert(!std::signbit(1.0f)); - assert(!std::signbit(0.0f)); - - constexpr float nan = std::numeric_limits::quiet_NaN(); - assert(!std::signbit(nan)); - assert(std::signbit(-nan)); + // 通常の数値 + std::cout << std::boolalpha; + std::cout << "-1.0f : " << std::signbit(-1.0f) << std::endl; + std::cout << "-0.0f : " << std::signbit(-0.0f) << std::endl; + + std::cout << "1.0f : " << std::signbit(1.0f) << std::endl; + std::cout << "0.0f : " << std::signbit(0.0f) << std::endl; + + // 無限大 + const double inf = std::numeric_limits::infinity(); + std::cout << "inf : " << std::signbit(inf) << std::endl; + std::cout << "-inf : " << std::signbit(-inf) << std::endl; + + // NaN (Not a Number) + // NaNの符号ビットも検出できる + const double nan = std::numeric_limits::quiet_NaN(); + std::cout << "nan : " << std::signbit(nan) << std::endl; + std::cout << "-nan : " << std::signbit(-nan) << std::endl; } ``` * std::signbit[color ff0000] +* infinity()[link /reference/limits/numeric_limits/infinity.md] +* quiet_NaN()[link /reference/limits/numeric_limits/quiet_nan.md] ### 出力 ``` +-1.0f : true +-0.0f : true +1.0f : false +0.0f : false +inf : false +-inf : true +nan : false +-nan : true ``` ### 備考