名前空間
変種
操作

std::fdim, std::fdimf, std::fdiml

From cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
ヘッダー <cmath> で定義
(1)
float       fdim ( float x, float y );

double      fdim ( double x, double y );

long double fdim ( long double x, long double y );
(C++23まで)
constexpr /*浮動小数点数型*/

            fdim ( /*浮動小数点型*/ x,

                   /*浮動小数点型*/ y );
(C++23から)
float       fdimf( float x, float y );
(2) (C++11以降)
(C++23 以降 constexpr)
long double fdiml( long double x, long double y );
(3) (C++11以降)
(C++23 以降 constexpr)
ヘッダー <simd> で定義
template< class V0, class V1 >

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

            fdim ( const V0& v_x, const V1& v_y );
(S) (C++26以降)
ヘッダー <cmath> で定義
template< class Integer >
double      fdim ( Integer x, Integer y );
(A) (C++23 以降 constexpr)
1-3) xyの正の差を返します。つまり、x > yの場合はx - yを返し、それ以外の場合(x <= yの場合)は+0を返します。ライブラリは、パラメータの型として、すべての cv-unqualified 浮動小数点型に対する std::fdim のオーバーロードを提供します。(C++23以降)
S) SIMDオーバーロードは、v_xv_yに対して要素ごとのstd::fdimを実行します。
(定義についてはmath-common-simd-tを参照のこと)
(C++26以降)
A) すべての整数型に対する追加のオーバーロードが提供されます。これらは double として扱われます。
(C++11以降)

目次

[編集] Parameters

x, y - 浮動小数点または整数値

[編集] Return value

成功した場合、xyの正の差を返します。

オーバーフローによる範囲エラーが発生した場合、+HUGE_VAL+HUGE_VALF、または +HUGE_VALL が返されます。

アンダーフローによる範囲エラーが発生した場合、(丸め後の)正しい値を返します。

[編集] Error handling

エラーは math_errhandling で指定された通りに報告される。

実装がIEEE浮動小数点算術 (IEC 60559) をサポートしている場合、

  • いずれかの引数が NaN の場合、NaN が返されます。

[編集] Notes

NaNの処理要件を除いて、std::fmax(x - y, 0) と同等です。

追加のオーバーロードは (A) とまったく同じように提供される必要はない。それらは、最初の引数 num1 と2番目の引数 num2 に対して以下を保証するのに十分である必要がある。

  • num1またはnum2の型がlong doubleの場合、std::fdim(num1, num2)std::fdim(static_cast<long double>(num1),
              static_cast<long double>(num2))
    と同じ効果を持ちます。
  • それ以外の場合、num1および/またはnum2の型がdoubleまたは整数型の場合、std::fdim(num1, num2)std::fdim(static_cast<double>(num1),
              static_cast<double>(num2))
    と同じ効果を持ちます。
  • それ以外の場合、num1またはnum2の型がfloatの場合、std::fdim(num1, num2)std::fdim(static_cast<float>(num1),
              static_cast<float>(num2))
    と同じ効果を持ちます。
(C++23まで)

num1num2が算術型の場合、std::fdim(num1, num2)std::fdim(static_cast</*共通浮動小数点型*/>(num1),
          static_cast</*共通浮動小数点型*/>(num2))
と同じ効果を持ちます。ここで、/*共通浮動小数点型*/は、num1num2の型の間で、最も高い浮動小数点変換ランクと最も高い浮動小数点変換サブランクを持つ浮動小数点型です。整数型の引数は、doubleと同じ浮動小数点変換ランクを持つとみなされます。

そのような最高のランクとサブランクセを持つ浮動小数点型が存在しない場合、オーバーロード解決は提供されたオーバーロードから使用可能な候補を導出しません。

(C++23から)

[編集] Example

#include <cerrno>
#include <cfenv>
#include <cmath>
#include <cstring>
#include <iostream>
 
#ifndef __GNUC__
#pragma STDC FENV_ACCESS ON
#endif
 
int main()
{
    std::cout << "fdim(4, 1) = " << std::fdim(4, 1) << '\n'
              << "fdim(1, 4) = " << std::fdim(1, 4) << '\n'
              << "fdim(4,-1) = " << std::fdim(4, -1) << '\n'
              << "fdim(1,-4) = " << std::fdim(1, -4) << '\n';
 
    // error handling 
    errno = 0;
    std::feclearexcept(FE_ALL_EXCEPT);
 
    std::cout << "fdim(1e308, -1e308) = " << std::fdim(1e308, -1e308) << '\n';
 
    if (errno == ERANGE)
        std::cout << "    errno == ERANGE: " << std::strerror(errno) << '\n';
    if (std::fetestexcept(FE_OVERFLOW))
        std::cout << "    FE_OVERFLOW raised\n";
}

出力

fdim(4, 1) = 3
fdim(1, 4) = 0
fdim(4,-1) = 5
fdim(1,-4) = 5
fdim(1e308, -1e308) = inf
    errno == ERANGE: Numerical result out of range
    FE_OVERFLOW raised

[編集] See also

整数値の絶対値を計算する (|x|)
(関数) [編集]
(C++11)(C++11)(C++11)
2つの浮動小数点数値のうち大きい方
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)