fabs(x) vs. (x) < 0 ? -(x) : (x)

drw at cullvax.UUCP drw at cullvax.UUCP
Fri Feb 20 02:22:11 AEST 1987


meissner at dg_rtp.UUCP (Michael Meissner) writes:
> In article <68 at umich.UUCP> jtr485 at umich.UUCP (Johnathan Tainter) writes:
> > #define fabs(X)     (((_fabs = (X)) < 0? -_fabs : _fabs))
> 
> It may solve that problem, but:
> 
> 	fabs( fabs( y ) - 10.0 )
> 
> would still get the wrong answer.

Eh?  Let's look at

	(_fabs = X) < 0 ? -_fabs : _fabs

1.  X has to be computed first.

2.  Its value is assigned to _fabs (because the assignment must be
performed before the value of the assignment is used).

3.  There is a sequence point after the test-expression of a ? :, so
all side-effects of X must be completed.

4.  We get to choose -_fabs or _fabs.

The only problem could arise if X affects _fabs via some side-effect.
But this is not possible, even with nested fabs() calls, because the
only code which changes _fabs is "_fabs = X", which is required to
store into _fabs before having its value used.

Dale
-- 
Dale Worley		Cullinet Software
UUCP: ...!seismo!harvard!mit-eddie!cullvax!drw
ARPA: cullvax!drw at eddie.mit.edu



More information about the Comp.lang.c mailing list