Date: Wed, 1 Jun 2016 23:56:58 +1000 (EST) From: Bruce Evans <brde@optusnet.com.au> To: Chris Torek <torek@torek.net> Cc: Bruce Evans <brde@optusnet.com.au>, Andrey Chernov <ache@freebsd.org>, pfg@freebsd.org, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r300956 - head/lib/libc/stdlib Message-ID: <20160601232109.D2616@besplex.bde.org> In-Reply-To: <201605312124.u4VLOhnI085631@elf.torek.net> References: <201605312124.u4VLOhnI085631@elf.torek.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 31 May 2016, Chris Torek wrote: >> That was what I was complaining about. div.c is for C90 (misspelled >> "ANSI"). > > It wasn't misspelled when I wrote it. :-) The 1989 ANSI C :-) > standard was formally ratified in Dec 1989, and the draft was > pretty firm by the time I wrote the code (which I am sure was also > 1989, despite the 1990 copyright; we added or updated all the > copyrights at the last minute, for net-2). ISO's quick adoption, > and hence the name C90, post-date all of that. The weren't quick enough to be in the same year. I usually spell the year as 90, but this can be confusing when discussing the compiler c89 or the compiler flag -std=c89. Hmm, old gcc doesn't have -std=c90, but clang does. >> >> Correct rounding for a >> positive divisor is towards minus infinity so that the remainder is >> not negative. This is modulo arithmetic and has good algebraic >> properties. C99 requires rounding minus infinity, at least for positive >> divisors, under the extension "reliable integer division". > > Did you state this backwards? For integer divison I see: Oops. I seem to have misedited a whole clause. "towards" is also missing. > When integers are divided, the result of the / operator is the > algebraic quotient with any fractional part discarded.[105] If > the quotient a/b is representable, the expression (a/b)*b + a%b > shall equal a; otherwise, the behavior of both a/b and a%b is > undefined. > > which (as footnote 105 notes) is "truncation towards zero", so that > (-1)/2 is 0 and not -1. > >> In C90, >> the rounding is implementation-defined, so it may be correct, but it >> is "unreliable" since it can be anything. >> >> In C90, div() is specified as giving "reliable" division, and that is >> what the fixups implement. This now wastes time to change nothing. > > Right -- as long as the compiler must meet C99 rules, div.c > can just use the / and % operators. ache added the ifdef. I checked that compilers (old gcc and current clang on amd64) don't auto-inline div(). It is very suitable for inlining without the fixup. Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20160601232109.D2616>