I was going through the R source code for the function gamma()
which points to this C source file .
The snippet of the code is as follows:
#ifdef NOMORE_FOR_THREADS
static int ngam = 0;
static double xmin = 0, xmax = 0., xsml = 0., dxrel = 0.;
/* Initialize machine dependent constants, the first time gamma() is called.
FIXME for threads ! */
if (ngam == 0) {
ngam = chebyshev_init(gamcs, 42, DBL_EPSILON/20);/*was .1*d1mach(3)*/
gammalims(&xmin, &xmax);/*-> ./gammalims.c */
xsml = exp(fmax2(log(DBL_MIN), -log(DBL_MAX)) + 0.01);
/* = exp(.01)*DBL_MIN = 2.247e-308 for IEEE */
dxrel = sqrt(DBL_EPSILON);/*was sqrt(d1mach(4)) */
}
#else
/* For IEEE double precision DBL_EPSILON = 2^-52 = 2.220446049250313e-16 :
* (xmin, xmax) are non-trivial, see ./gammalims.c
* xsml = exp(.01)*DBL_MIN
* dxrel = sqrt(DBL_EPSILON) = 2 ^ -26
*/
# define ngam 22
# define xmin -170.5674972726612
# define xmax 171.61447887182298
# define xsml 2.2474362225598545e-308
# define dxrel 1.490116119384765696e-8
#endif
Now I understand that this piece of code is initializing values of variables like ngam
, xsml
, dxrel
etc. But I don't understand what is NOMORE_FOR_THREADS
.
I could not find where that is defined so I am confused as to when would it enter the #ifdef
clause or else just go in the #else
clause and define the variables according to IEEE standard.
If anyone can shed some light on what is NOMORE_FOR_THREADS
or where it is defined, it would be really helpful.
Thanks for the help.
Looks like that #ifdef
was added in revision 13433:
> svn log -vr13433
------------------------------------------------------------------------
r13433 | maechler | 2001-04-10 10:05:54 -0500 (Tue, 10 Apr 2001) | 2 lines
Changed paths:
M /trunk/src/nmath/beta.c
M /trunk/src/nmath/gamma.c
M /trunk/src/nmath/lgamma.c
M /trunk/src/nmath/lgammacor.c
globals now #ifdef NOMORE_FOR_THREADS
------------------------------------------------------------------------
And here's the diff with the previous revision:
> svn diff -r13432:13433 src/nmath/gamma.c
Index: src/nmath/gamma.c
===================================================================
--- src/nmath/gamma.c (revision 13432)
+++ src/nmath/gamma.c (revision 13433)
@@ -1,7 +1,7 @@
/*
* Mathlib : A C Library of Special Functions
* Copyright (C) 1998 Ross Ihaka
- * Copyright (C) 2000 The R Development Core Team
+ * Copyright (C) 2000-2001 The R Development Core Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -40,7 +40,7 @@
double gammafn(double x)
{
- static /* const */ double gamcs[42] = {
+ const double gamcs[42] = {
+.8571195590989331421920062399942e-2,
+.4415381324841006757191315771652e-2,
+.5685043681599363378632664588789e-1,
@@ -89,6 +89,7 @@
double y;
double sinpiy, value;
+#ifdef NOMORE_FOR_THREADS
static int ngam = 0;
static double xmin = 0, xmax = 0., xsml = 0., dxrel = 0.;
@@ -101,6 +102,18 @@
/* = exp(.01)*DBL_MIN = 2.247e-308 for IEEE */
dxrel = sqrt(1/DBL_EPSILON);/*was (1/d1mach(4)) */
}
+#else
+/* For IEEE double precision DBL_EPSILON = 2^-52 = 2.220446049250313e-16 :
+ * (xmin, xmax) are non-trivial, see ./gammalims.c
+ * xsml = exp(.01)*DBL_MIN
+ * dxrel = sqrt(1/DBL_EPSILON) = 2 ^ 26
+*/
+# define ngam 22
+# define xmin -170.5674972726612
+# define xmax 171.61447887182298
+# define xsml 2.2474362225598545e-308
+# define dxrel 67108864.
+#endif
if(ISNAN(x)) return x;
I didn't see NOMORE_FOR_THREADS
defined anywhere in the source code in that revision, the next couple hundred revisions after it was added, or in current revisions. It's possible (though seems unlikely) that it could be defined in some system header file. It seems more likely that it would be specified via a command line argument.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.