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

< cpp‎ | numeric‎ | math

定义于头文件 `<cmath>` |  |
float fdim ( float x, float y ); float fdimf( float x, float y ); | (1) | (C++11 起)
double fdim ( double x, double y ); | (2) | (C++11 起)
long double fdim ( long double x, long double y ); long double fdiml( long double x, long double y ); | (3) | (C++11 起)
Promoted fdim ( Arithmetic1 x, Arithmetic2 y ); | (4) | (C++11 起)

1-3) 返回 x 与 y 间的正差，即若 x>y 则返回 x-y ，否则（若 x≤y ）返回 +0 。
4) 任何 1-3) 所不覆盖的算术类型参数组合的重载集或函数模板。若任何参数拥有整数类型，则将它转型为 double 。若任何参数为 long double ，则返回类型 `Promoted` 亦为 long double ，否则返回类型始终为 double 。

### 参数

x, y | - | 浮点或整数类型值

### 返回值

若成功，则返回 x 与 y 间的正差。

若出现上溢所致的值域错误，则返回 `+HUGE_VAL` 、 `+HUGE_VALF` 或 `+HUGE_VALL` 。

若出现下溢所致的值域错误，则返回（舍入后的）正确结果。

### 错误处理

报告 math_errhandling 中指定的错误。

若实现支持 IEEE 浮点算术（ IEC 60559 ），则

- 若任一参数为 NaN ，则返回 NaN

### 注意

等价于 std::fmax(x-y, 0) ，除了 NaN 处理要求。

### 示例

    #include <iostream>
    #include <cmath>
    #include <cerrno>
    #include <cstring>
    #include <cfenv>
    #pragma STDC FENV_ACCESS ON
    int main()
    {
        std::cout << "fdim(4, 1) = " << std::fdim(4, 1)
                  << " fdim(1, 4) = " << std::fdim(1, 4) << '\n'
                  << "fdim(4,-1) = " << std::fdim(4, -1)
                  << " 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

### 参阅

abs(int)labs llabs (C++11) | 计算整数值的绝对值（ \(\small{|x|}\)|x| ） (函数)
fmax fmaxf fmaxl (C++11)(C++11)(C++11) | 两个浮点值的较大者 (函数)