2015-11-03 69 views
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 

現在我明白了,這一段代碼初始化的變量值像ngamxsmldxrel等,但我不明白什麼是NOMORE_FOR_THREADS

我找不到定義的位置,所以我很困惑它何時會進入#ifdef子句,或者只是進入#else子句並根據IEEE標準定義變量。

如果任何人都可以對NOMORE_FOR_THREADS或其定義的位置有所瞭解,那將非常有幫助。

感謝您的幫助。

回答

2

貌似是#ifdef在修訂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 

------------------------------------------------------------------------ 

而這裏和以前版本的差異:

> 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; 

我沒有看到NOMORE_FOR_THREADS任何地方定義在源代碼中該修訂版,接下來的幾百次修訂版,或者在當前的修訂版中。有可能(儘管看起來不太可能)可以在某些系統頭文件中定義它。它似乎更有可能通過命令行參數來指定。

+0

有可能這段代碼什麼都不做,因爲R是單線程的? – Sid

+0

@Sid:可能的,並且可能支持來自其他應用程序的R數學庫的多線程使用。但這只是猜測。 –

+0

也許這是來自Fortan的翻譯或者從未完成的東西......從R調用的C程序當然可以使用OpenMP或pthreads,因此它們可能從未完成實現。同時,看起來更像是他們正在檢查可能定義NOMORE_FOR_THREADS的特定平臺的精度,但我意識到這不是一個明確的答案。 – JimLohse