2
我正在通過指向this C source file的函數gamma()
的R源代碼。R語言源代碼 - C代碼中的NOMORE_FOR_THREADS是什麼
代碼的片段如下:
#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
現在我明白了,這一段代碼初始化的變量值像ngam
,xsml
,dxrel
等,但我不明白什麼是NOMORE_FOR_THREADS
。
我找不到定義的位置,所以我很困惑它何時會進入#ifdef
子句,或者只是進入#else
子句並根據IEEE標準定義變量。
如果任何人都可以對NOMORE_FOR_THREADS
或其定義的位置有所瞭解,那將非常有幫助。
感謝您的幫助。
有可能這段代碼什麼都不做,因爲R是單線程的? – Sid
@Sid:可能的,並且可能支持來自其他應用程序的R數學庫的多線程使用。但這只是猜測。 –
也許這是來自Fortan的翻譯或者從未完成的東西......從R調用的C程序當然可以使用OpenMP或pthreads,因此它們可能從未完成實現。同時,看起來更像是他們正在檢查可能定義NOMORE_FOR_THREADS的特定平臺的精度,但我意識到這不是一個明確的答案。 – JimLohse