mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-01 17:30:07 +00:00
b7c83ca30e
Remove the slow paths from log. Like several other double precision math functions, log is exactly rounded. This is not required from math functions and causes major overheads as it requires multiple fallbacks using higher precision arithmetic if a result is close to 0.5ULP. Ridiculous slowdowns of up to 100000x have been reported when the highest precision path triggers. Interestingly removing the slow paths makes hardly any difference in practice: the worst case error is still ~0.502ULP, and exp(log(x)) shows identical results before/after on many millions of random cases. All GLIBC math tests pass on AArch64 and x64 with no change in ULP error. A simple test over a few hundred million values shows log is now 18% faster on average. * manual/probes.texi (slowlog): Delete documentation of removed probe. (slowlog_inexact): Likewise * sysdeps/ieee754/dbl-64/e_log.c (__ieee754_log): Remove slow paths. * sysdeps/ieee754/dbl-64/ulog.h: Remove unused declarations.
94 lines
4.3 KiB
C
94 lines
4.3 KiB
C
/*
|
|
* IBM Accurate Mathematical Library
|
|
* Written by International Business Machines Corp.
|
|
* Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation; either version 2.1 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/******************************************************************/
|
|
/* */
|
|
/* MODULE_NAME:ulog.h */
|
|
/* */
|
|
/* common data and variables prototype and definition */
|
|
/******************************************************************/
|
|
|
|
#ifndef ULOG_H
|
|
#define ULOG_H
|
|
|
|
#ifdef BIG_ENDI
|
|
static const number
|
|
/* polynomial I */
|
|
/**/ a2 = {{0xbfe00000, 0x0001aa8f} }, /* -0.500... */
|
|
/**/ a3 = {{0x3fd55555, 0x55588d2e} }, /* 0.333... */
|
|
/* polynomial II */
|
|
/**/ b0 = {{0x3fd55555, 0x55555555} }, /* 0.333... */
|
|
/**/ b1 = {{0xbfcfffff, 0xffffffbb} }, /* -0.249... */
|
|
/**/ b2 = {{0x3fc99999, 0x9999992f} }, /* 0.199... */
|
|
/**/ b3 = {{0xbfc55555, 0x556503fd} }, /* -0.166... */
|
|
/**/ b4 = {{0x3fc24924, 0x925b3d62} }, /* 0.142... */
|
|
/**/ b5 = {{0xbfbffffe, 0x160472fc} }, /* -0.124... */
|
|
/**/ b6 = {{0x3fbc71c5, 0x25db58ac} }, /* 0.111... */
|
|
/**/ b7 = {{0xbfb9a4ac, 0x11a2a61c} }, /* -0.100... */
|
|
/**/ b8 = {{0x3fb75077, 0x0df2b591} }, /* 0.091... */
|
|
/* constants */
|
|
/**/ sqrt_2 = {{0x3ff6a09e, 0x667f3bcc} }, /* sqrt(2) */
|
|
/**/ h1 = {{0x3fd2e000, 0x00000000} }, /* 151/2**9 */
|
|
/**/ h2 = {{0x3f669000, 0x00000000} }, /* 361/2**17 */
|
|
/**/ delu = {{0x3f700000, 0x00000000} }, /* 1/2**8 */
|
|
/**/ delv = {{0x3ef00000, 0x00000000} }, /* 1/2**16 */
|
|
/**/ ln2a = {{0x3fe62e42, 0xfefa3800} }, /* ln(2) 43 bits */
|
|
/**/ ln2b = {{0x3d2ef357, 0x93c76730} }, /* ln(2)-ln2a */
|
|
/**/ two54 = {{0x43500000, 0x00000000} }, /* 2**54 */
|
|
/**/ u03 = {{0x3f9eb851, 0xeb851eb8} }; /* 0.03 */
|
|
|
|
#else
|
|
#ifdef LITTLE_ENDI
|
|
static const number
|
|
/* polynomial I */
|
|
/**/ a2 = {{0x0001aa8f, 0xbfe00000} }, /* -0.500... */
|
|
/**/ a3 = {{0x55588d2e, 0x3fd55555} }, /* 0.333... */
|
|
/* polynomial II */
|
|
/**/ b0 = {{0x55555555, 0x3fd55555} }, /* 0.333... */
|
|
/**/ b1 = {{0xffffffbb, 0xbfcfffff} }, /* -0.249... */
|
|
/**/ b2 = {{0x9999992f, 0x3fc99999} }, /* 0.199... */
|
|
/**/ b3 = {{0x556503fd, 0xbfc55555} }, /* -0.166... */
|
|
/**/ b4 = {{0x925b3d62, 0x3fc24924} }, /* 0.142... */
|
|
/**/ b5 = {{0x160472fc, 0xbfbffffe} }, /* -0.124... */
|
|
/**/ b6 = {{0x25db58ac, 0x3fbc71c5} }, /* 0.111... */
|
|
/**/ b7 = {{0x11a2a61c, 0xbfb9a4ac} }, /* -0.100... */
|
|
/**/ b8 = {{0x0df2b591, 0x3fb75077} }, /* 0.091... */
|
|
/* constants */
|
|
/**/ sqrt_2 = {{0x667f3bcc, 0x3ff6a09e} }, /* sqrt(2) */
|
|
/**/ h1 = {{0x00000000, 0x3fd2e000} }, /* 151/2**9 */
|
|
/**/ h2 = {{0x00000000, 0x3f669000} }, /* 361/2**17 */
|
|
/**/ delu = {{0x00000000, 0x3f700000} }, /* 1/2**8 */
|
|
/**/ delv = {{0x00000000, 0x3ef00000} }, /* 1/2**16 */
|
|
/**/ ln2a = {{0xfefa3800, 0x3fe62e42} }, /* ln(2) 43 bits */
|
|
/**/ ln2b = {{0x93c76730, 0x3d2ef357} }, /* ln(2)-ln2a */
|
|
/**/ two54 = {{0x00000000, 0x43500000} }, /* 2**54 */
|
|
/**/ u03 = {{0xeb851eb8, 0x3f9eb851} }; /* 0.03 */
|
|
|
|
#endif
|
|
#endif
|
|
|
|
#define SQRT_2 sqrt_2.d
|
|
#define DEL_U delu.d
|
|
#define DEL_V delv.d
|
|
#define LN2A ln2a.d
|
|
#define LN2B ln2b.d
|
|
#define U03 u03.d
|
|
|
|
#endif
|