C
数值 | Numerics

fdim

fdim

在头文件中定义
float fdimf(float x,float y);(1)(自C99以来)
double fdim(double x,double y);(2)(自C99以来)
long double fdiml(long double x,long double y);(3)(自C99以来)
在头文件<tgmath.h>中定义
#define fdim(x,y)(4)(自C99以来)

1-3)返回x和y之间的正差,即如果x> y,则返回x-y,否则(如果x≤y)返回+0。

4)类型 - 通用宏:如果任何参数的类型为long double,则调用fdiml。 否则,如果任何参数具有整数类型或具有double类型,则调用fdim。 否则,调用fdimf。

参数

x, y-floating point value

返回值

如果成功,则返回x和y之间的正差异。

如果发生由溢出引起的范围错误,则返回+ HUGE_VAL,+ HUGE_VALF或+ HUGE_VALL。

如果发生由于下溢导致的范围错误,则返回正确的值(舍入后)。

错误处理

按照math_errhandling中的指定报告错误。

如果实现支持IEEE浮点运算(IEC 60559),

  • 如果任一参数是NaN,则返回NaN

注意

除NaN处理要求外,相当于fmax(x-y,0)。

#include <stdio.h> #include <math.h> #include <errno.h> #include <fenv.h> #pragma STDC FENV_ACCESS ON int main(void) { printf("fdim(4, 1) = %f, fdim(1, 4)=%f\n", fdim(4,1), fdim(1,4) printf("fdim(4,-1) = %f, fdim(1,-4)=%f\n", fdim(4,-1), fdim(1,-4) //error handling errno = 0; feclearexcept(FE_ALL_EXCEPT printf("fdim(1e308, -1e308) = %f\n", fdim(1e308, -1e308) if(errno == ERANGE) perror(" errno == ERANGE" if(fetestexcept(FE_OVERFLOW)) puts(" FE_OVERFLOW raised" }

可能的输出:

fdim(4, 1) = 3.000000, fdim(1, 4)=0.000000 fdim(4,-1) = 5.000000, fdim(1,-4)=5.000000 fdim(1e308, -1e308) = inf errno == ERANGE: Numerical result out of range FE_OVERFLOW raised

参考

  • C11标准(ISO / IEC 9899:2011):

扩展内容

abslabsllabs(C99)计算积分值的绝对值(| x |)(函数)
fmaxfmaxffmax1(C99)(C99)(C99)决定两个浮点值中较大的一个(函数)

| 用于fdim的C ++文档 |