Short-circuit Logic
Nobody
nobody at nowhere.com
Mon May 27 13:52:15 EDT 2013
On Sun, 26 May 2013 04:11:56 -0700, Ahmed Abdulshafy wrote:
> I'm having a hard time wrapping my head around short-circuit logic that's
> used by Python, coming from a C/C++ background; so I don't understand why
> the following condition is written this way!>
>
> if not allow_zero and abs(x) < sys.float_info.epsilon:
> print("zero is not allowed")
>
> The purpose of this snippet is to print the given line when allow_zero is
> False and x is 0.
I don't understand your confusion. The above is directly equivalent to the
following C code:
if (!allow_zero && fabs(x) < DBL_EPSILON)
printf("zero is not allowed\n");
In either case, the use of short-circuit evaluation isn't necessary here;
it would work just as well with a strict[1] "and" operator.
Short-circuit evaluation is useful if the second argument is expensive to
compute, or (more significantly) if the second argument should not be
evaluated if the first argument is false; e.g. if x is a pointer then:
if (x && *x) ...
relies upon short-circuit evaluation to avoid dereferencing a null pointer.
On an unrelated note: the use of the "epsilon" value here is
almost certainly wrong. If the intention is to determine if the result of
a calculation is zero to within the limits of floating-point accuracy,
then it should use a value which is proportional to the values used in
the calculation.
More information about the Python-list
mailing list