Namespaces
Variants

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

From ru.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)
(constexpr начиная с C++23)
long double fdiml ( long double x, long double y ) ;
(3) (начиная с C++11)
(constexpr начиная с C++23)
SIMD перегрузка (начиная с C++26)
Определено в заголовке <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) (constexpr начиная с C++23)
1-3) Возвращает положительную разность между x и y , то есть, если x > y , возвращает x - y , в противном случае (т.е. если x <= y ) возвращает + 0 . Библиотека предоставляет перегрузки std::fdim для всех cv-неквалифицированных типов с плавающей точкой в качестве типа параметров. (since C++23)
S) SIMD перегрузка выполняет поэлементное вычисление std::fdim для v_x и v_y .
(См. math-common-simd-t для его определения.)
(since C++26)
A) Для всех целочисленных типов предоставлены дополнительные перегрузки, которые обрабатываются как double .
(since C++11)

Содержание

Параметры

x, y - значения с плавающей точкой или целочисленные значения

Возвращаемое значение

В случае успеха возвращает положительную разность между x и y .

Если происходит ошибка диапазона из-за переполнения, +HUGE_VAL , +HUGE_VALF , или +HUGE_VALL возвращается.

Если происходит ошибка диапазона из-за потери значимости (underflow), возвращается корректное значение (после округления).

Обработка ошибок

Ошибки сообщаются, как указано в 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)
большее из двух значений с плавающей точкой
(функция)