From owner-freebsd-numerics@FreeBSD.ORG Sun May 10 06:15:00 2015 Return-Path: Delivered-To: freebsd-numerics@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 7E616CDE for ; Sun, 10 May 2015 06:15:00 +0000 (UTC) Received: from troutmask.apl.washington.edu (troutmask.apl.washington.edu [128.95.76.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "troutmask", Issuer "troutmask" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 460E9140F for ; Sun, 10 May 2015 06:15:00 +0000 (UTC) Received: from troutmask.apl.washington.edu (localhost [127.0.0.1]) by troutmask.apl.washington.edu (8.14.9/8.14.9) with ESMTP id t4A6Ex4d083030 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2015 23:14:59 -0700 (PDT) (envelope-from sgk@troutmask.apl.washington.edu) Received: (from sgk@localhost) by troutmask.apl.washington.edu (8.14.9/8.14.9/Submit) id t4A6Ewj2083029; Sat, 9 May 2015 23:14:58 -0700 (PDT) (envelope-from sgk) Date: Sat, 9 May 2015 23:14:58 -0700 From: Steve Kargl To: Bruce Evans Cc: freebsd-numerics@freebsd.org Subject: Re: small cleanup patch for e_pow.c Message-ID: <20150510061458.GA82518@troutmask.apl.washington.edu> References: <20150510002910.GA82261@troutmask.apl.washington.edu> <20150510113454.O841@besplex.bde.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150510113454.O841@besplex.bde.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-BeenThere: freebsd-numerics@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "Discussions of high quality implementation of libm functions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 10 May 2015 06:15:00 -0000 On Sun, May 10, 2015 at 11:59:55AM +1000, Bruce Evans wrote: > On Sat, 9 May 2015, Steve Kargl wrote: > > > In reading, e_pow.c I found a small piece of code that > > can be remove. Anyone object? > > > > Index: src/e_pow.c > > =================================================================== > > --- src/e_pow.c (revision 1603) > > +++ src/e_pow.c (working copy) > > @@ -187,10 +187,6 @@ __ieee754_pow(double x, double y) > > > > /* |y| is huge */ > > if(iy>0x41e00000) { /* if |y| > 2**31 */ > > - if(iy>0x43f00000){ /* if |y| > 2**64, must o/uflow */ > > - if(ix<=0x3fefffff) return (hy<0)? huge*huge:tiny*tiny; > > - if(ix>=0x3ff00000) return (hy>0)? huge*huge:tiny*tiny; > > - } > > /* over/underflow if x is not close to one */ > > if(ix<0x3fefffff) return (hy<0)? s*huge*huge:s*tiny*tiny; > > if(ix>0x3ff00000) return (hy>0)? s*huge*huge:s*tiny*tiny; > > It seems to be just an optimization. It is a large optimization for > the huge args, but those are not common, and is at most a tiny > pessimization for non-huge args (just an extra branch which can be > predicted perfectly if non-huge args are never used). > I don't see how this can be an optimization. The code has the form if (|y| > 2**31) { if (|y| > 2**64) { if (a) return if (b) return } if (a') return if (b') return ... } The difference between a and a' is <= instead of <, and similar for b and b' with >= and >. If either a or b would have return, so will a' and b'. If neither a nor b return, then neither a' nor b' will return. The a' and b' lines were added by das in r141296, where the commit message says the change is for fdlibm 5.3 compatibility. I'll also note that block like 'if (|y|>2**64) { }' is not present in e_powf.c -- Steve