Absolute value[]
The absolute value function returns the "size" of a number. The size of a nonnegative number X is always X itself, but if the number is negative it is -X. On implementation need the function would in C and C++ look like:
double dabs (double X) { if (X >= 0) return X; return -X; }
This may pose problems if the argument is int, in which case another specialized function iabs for integers and fabs for single precision float are desired. C, C++ and most other strongly typed programming languages all have this problem, but in C++ and other generic/template providing PL:s using templates is an alternative, such as in C++:
template <class NUM> NUM abs (NUM X) { if (X >= 0) return X; return -X; }
which if to be used somewhere either can be explicitly accessed like:
float K; K = get_my_float_val (something); K = abs<float>(K);
or is implicitly deduced by compiler so that
double D, I, X; I = abs(1); // accesses abs<int> X = abs(1.1); // accesses abs<float> D = abs(D); // accesses abs<double based>
Minimum function[]
C function:
double dmin (double X, double Y) { if (X >= Y) return Y; return X; }
In template/generic languages same technique as for absolute value can be used.
C macro can also be used for typelessness when no template system is available:
#define MIN(X,Y) ((X)>(Y)?(Y):(X))
As usual with C macros beware of side effects in provided arguments, the classical case being an incremental operation:
j = MIN(i++,k);
Which expands to:
j = ((i++)>(k)?(k):(i++));
If i
is larger than k
, then i++
is called twice, not once as would be the naive interpretation of the line:
j = MIN(i++,k);
Maximum function[]
C:
double dmax (double X, double Y) { if (X >= Y) return X; return Y; }
In template/generic languages same technique as for absolute value can be used.
C macro:
#define MIN(X,Y) ((X)>(Y)?(X):(Y))