This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Use more decimal places for long double constants in math.h


When updating ulps for MIPS64, I noticed a 1ulp error reported for
sqrtl (2).  This is bad - sqrt is a fully-specified IEEE 754 function
and should have no ulps - although it was already in the ulps file.

Investigating shows that the problem is not with sqrtl but with the
expected result M_SQRT2l.  Although the decimal value in math.h is a
correct rounding of sqrt (2) to 34 places after the decimal point,
rounding that value to 113 bits produces a different result from
directly rounding sqrt (2) to 113 bits.  Rounded to nearest to 113
bits, sqrt(2) is 0x1.6a09e667f3bcc908b2fb1366ea95p+0, but the decimal
number in math.h is 0x1.6a09e667f3bcc908b2fb1366ea96p+0.  (To more hex
places, sqrt(2) actually continues ...[95]7d3e... while that decimal
number continues ...[95]99ba; that is, sqrt(2) is quite close to half
way between two adjacent representable values.)

I propose this patch to increase the number of digits for all the long
double constants in math.h so they round correctly to 113 bits.  35
digits after the decimal point suffices for all the constants except
for M_LOG2E_l, where the 34-digit approximation rounds correctly but
the 35-digit one does not, so I used 36 digits after the point which
produces correct results for all the constants.

Tested x86_64 as a sanity check.  As well as MIPS64 this should allow
sqrt ulps to be removed for s390, sparc and alpha.  I note there are
also sqrt ulps for double on powerpc; the architecture maintainers may
wish to see if those are still applicable, because if so then that is
a bug (and if not applicable, the ulps should be removed).

2012-05-31  Joseph Myers  <joseph@codesourcery.com>

	* math/math.h (M_El): Use two more decimal places.
	(M_LOG2El): Likewise.
	(M_LOG10El): Likewise.
	(M_LN2l): Likewise.
	(M_LN10l): Likewise.
	(M_PIl): Likewise.
	(M_PI_2l): Likewise.
	(M_PI_4l): Likewise.
	(M_1_PIl): Likewise.
	(M_2_PIl): Likewise.
	(M_2_SQRTPIl): Likewise.
	(M_SQRT2l): Likewise.
	(M_SQRT1_2l): Likewise.

diff --git a/math/math.h b/math/math.h
index 10ea2b4..bcdd5c9 100644
--- a/math/math.h
+++ b/math/math.h
@@ -365,19 +365,19 @@ extern int matherr (struct exception *__exc);
    Therefore we provide as an extension constants with similar names as a
    GNU extension.  Provide enough digits for the 128-bit IEEE quad.  */
 #ifdef __USE_GNU
-# define M_El		2.7182818284590452353602874713526625L  /* e */
-# define M_LOG2El	1.4426950408889634073599246810018921L  /* log_2 e */
-# define M_LOG10El	0.4342944819032518276511289189166051L  /* log_10 e */
-# define M_LN2l		0.6931471805599453094172321214581766L  /* log_e 2 */
-# define M_LN10l	2.3025850929940456840179914546843642L  /* log_e 10 */
-# define M_PIl		3.1415926535897932384626433832795029L  /* pi */
-# define M_PI_2l	1.5707963267948966192313216916397514L  /* pi/2 */
-# define M_PI_4l	0.7853981633974483096156608458198757L  /* pi/4 */
-# define M_1_PIl	0.3183098861837906715377675267450287L  /* 1/pi */
-# define M_2_PIl	0.6366197723675813430755350534900574L  /* 2/pi */
-# define M_2_SQRTPIl	1.1283791670955125738961589031215452L  /* 2/sqrt(pi) */
-# define M_SQRT2l	1.4142135623730950488016887242096981L  /* sqrt(2) */
-# define M_SQRT1_2l	0.7071067811865475244008443621048490L  /* 1/sqrt(2) */
+# define M_El		2.718281828459045235360287471352662498L /* e */
+# define M_LOG2El	1.442695040888963407359924681001892137L /* log_2 e */
+# define M_LOG10El	0.434294481903251827651128918916605082L /* log_10 e */
+# define M_LN2l		0.693147180559945309417232121458176568L /* log_e 2 */
+# define M_LN10l	2.302585092994045684017991454684364208L /* log_e 10 */
+# define M_PIl		3.141592653589793238462643383279502884L /* pi */
+# define M_PI_2l	1.570796326794896619231321691639751442L /* pi/2 */
+# define M_PI_4l	0.785398163397448309615660845819875721L /* pi/4 */
+# define M_1_PIl	0.318309886183790671537767526745028724L /* 1/pi */
+# define M_2_PIl	0.636619772367581343075535053490057448L /* 2/pi */
+# define M_2_SQRTPIl	1.128379167095512573896158903121545172L /* 2/sqrt(pi) */
+# define M_SQRT2l	1.414213562373095048801688724209698079L /* sqrt(2) */
+# define M_SQRT1_2l	0.707106781186547524400844362104849039L /* 1/sqrt(2) */
 #endif
 
 

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]