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 ++文档 |