Namespaces
Variants

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

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)
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 fdim ( float x, float y ) ;

double fdim ( double x, double y ) ;

long double fdim ( long double x, long double y ) ;
(C++23まで)
constexpr /*floating-point-type*/

fdim ( /*floating-point-type*/ x,

/*floating-point-type*/ 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) x y の正の差を返す。つまり、 x > y の場合、 x - y を返し、それ以外の場合(つまり x <= y の場合)は + 0 を返す。 ライブラリは、パラメータの型としてすべてのcv修飾されていない浮動小数点型に対する std::fdim のオーバーロードを提供する。 (C++23以降)
S) SIMDオーバーロードは、 v_x v_y に対して要素ごとの std::fdim を実行します。
(定義については math-common-simd-t を参照)
(C++26以降)
A) すべての整数型に対して追加のオーバーロードが提供されており、これらは double として扱われます。
(since C++11)

目次

パラメータ

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

戻り値

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

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

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

エラー処理

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

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

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

注記

std:: fmax ( x - y, 0 ) と同等ですが、NaNの扱いに関する要件は除きます。

追加のオーバーロードは (A) と完全に同一である必要はありません。それらは、第一引数 num1 と第二引数 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まで)

num1 num2 が算術型を持つ場合、 std :: fdim ( num1, num2 ) std :: fdim ( static_cast < /*common-floating-point-type*/ > ( num1 ) ,
static_cast < /*common-floating-point-type*/ > ( num2 ) )
と同じ効果を持つ。ここで /*common-floating-point-type*/ num1 num2 の型の間で最大の 浮動小数点変換ランク と最大の 浮動小数点変換サブランク を持つ浮動小数点型であり、整数型の引数は double と同じ浮動小数点変換ランクを持つと見なされる。

最大のランクとサブランクを持つそのような浮動小数点型が存在しない場合、 オーバーロード解決 は提供されたオーバーロードから使用可能な候補を結果として生成しない。

(C++23以降)

#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';
    // エラー処理 
    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

関連項目

整数値の絶対値を計算する ( |x| )
(関数)
(C++11) (C++11) (C++11)
2つの浮動小数点値のうち大きい方
(関数)