This is the mail archive of the
glibc-bugs@sourceware.org
mailing list for the glibc project.
[Bug math/706] pow() produces inaccurate results for base ~ 1.0, and large exponent on 32-bit x86
- From: "vincent-srcware at vinc17 dot net" <sourceware-bugzilla at sourceware dot org>
- To: glibc-bugs at sources dot redhat dot com
- Date: Mon, 27 Feb 2012 15:40:08 +0000
- Subject: [Bug math/706] pow() produces inaccurate results for base ~ 1.0, and large exponent on 32-bit x86
- Auto-submitted: auto-generated
- References: <bug-706-131@http.sourceware.org/bugzilla/>
http://sourceware.org/bugzilla/show_bug.cgi?id=706
--- Comment #10 from Vincent LefÃvre <vincent-srcware at vinc17 dot net> 2012-02-27 15:40:08 UTC ---
(In reply to comment #9)
> Created attachment 6245 [details]
> C code with a better algorithm
Note concerning your code: it assumes that char is signed. You should use int
for small integers, not char.
> When the exponent is an integer, a fast exponentiation is used
[...]
This is not perfect (you still won't get a very accurate result), but certainly
better than the current code (I haven't looked at it), which is apparently
affected by a cancellation. Note that if you want to compute pow(x,y) where y
is not necessarily an integer, you can write y = yi + yf, where yi is an
integer and |yf| < 1 (e.g. |yf| <= 0.5 or 0 <= yf < 1). Then mathematically,
pow(x,y) = pow(pow(x,yi),yf), and you can use that to get a more accurate
result than the current algorithm (I haven't checked in detail...).
For more accurate algorithms concerning the integer powers:
@Article{KLLLM2009a,
AUTHOR = {P. Kornerup and Ch. Lauter and V. LefÃvre and N.
Louvet and J.-M. Muller},
TITLE = {Computing Correctly Rounded Integer Powers in
Floating-Point Arithmetic},
JOURNAL = {{ACM} Transactions on Mathematical Software},
VOLUME = {37},
NUMBER = {1},
MONTH = jan,
YEAR = {2010},
URL = {http://doi.acm.org/10.1145/1644001.1644005},
DOI = {10.1145/1644001.1644005}
}
and for correct rounding of the general pow() function, assuming you already
have an accurate algorithm:
@Article{LauLef2009a,
AUTHOR = {Ch. Lauter and V. LefÃvre},
TITLE = {An efficient rounding boundary test for
\texttt{pow(x,y)} in double precision},
JOURNAL = {{IEEE} Transactions on Computers},
PUBLISHER = {{IEEE} Computer Society Press, Los Alamitos, CA},
VOLUME = {58},
NUMBER = {2},
PAGES = {197--207},
MONTH = feb,
YEAR = {2009},
KEYWORDS = {floating-point arithmetic,correct rounding,power
function},
URL =
{http://www.vinc17.net/research/papers/ieeetc2009-powr.pdf},
DOI = {10.1109/TC.2008.202}
}
--
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.