On 2013-10-21 11:06, John Gilmore wrote: > > [signum] is available as a BIF called sign in PL/I, where it is [almost > always] > implemented in line. An analogous function is available for strings > in C, where it is implemented as a library subroutine. It has always > been available in FORTRAN in the form of the much deprecated but in > fact enormously useful arithmetic-IF statement > (They seem to have borrowed the name from FORTRAN.)
One might consider implementing a dyadic signum as: #define signum2( a, b ) ( ( ( a ) < ( b ) ) - ( ( a ) > ( b ) ) ) ... in any language where TRUE==1 and FALSE==0. (Is this the case in PL/I?) Beware the shortcut: #define signum2( a, b ) ( signum( ( b ) - ( a ) ) ) ... which misbehaves for extreme values of a and b. Alas, I know of no C implementation which reports integer overflow of signed operands, although ANSI tolerates this behavior. I prefer to be told of such exceptional conditions. (Didn't you say that PL/I lately robbed programmers of that facility?) I find a few occurrences of FPE_INTOVF buried in /usr/include. -- gil