Path: csiph.com!usenet.pasdenom.info!news.etla.org!nntp-feed.chiark.greenend.org.uk!ewrotcd!feeds.news.ox.ac.uk!news.ox.ac.uk!zen.net.uk!hamilton.zen.co.uk!reader01.nrc01.news.zen.net.uk.POSTED!not-for-mail From: Nobody Subject: Re: Short-circuit Logic Date: Mon, 27 May 2013 18:52:15 +0100 User-Agent: Pan/0.14.2 (This is not a psychotic episode. It's a cleansing moment of clarity.) Message-Id: Newsgroups: comp.lang.python References: <5f101d70-e51f-4531-9153-c92ee2486fd9@googlegroups.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lines: 35 Organization: Zen Internet NNTP-Posting-Host: 07d09d9d.news.zen.co.uk X-Trace: DXC=a0R3JfF\]7a05G]jnOkg8ga0UP_O8AJol=dR0\ckLKG`WeZ<[7LZNRf2G@oAfVNFjfM2Z^cWRFGAk0do^oKF]NF` X-Complaints-To: abuse@zen.co.uk Xref: csiph.com comp.lang.python:46213 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.