// pi() liefert die Zahl pi im Default-Float-Format.
extern const cl_F pi (void);
-//CL_REQUIRE(cl_F_pi_var)
-
// sin(x) liefert den Sinus (sin x) eines Float x.
extern const cl_F sin (const cl_F& x);
const cl_F pi (const cl_F& y)
{
floattypecase(y
- , return cl_SF_pi;
- , return cl_FF_pi;
- , return cl_DF_pi;
+ , return cl_SF_pi();
+ , return cl_FF_pi();
+ , return cl_DF_pi();
, return pi(TheLfloat(y)->len);
);
}
const cl_F pi (void)
{
floatformatcase(default_float_format
- , return cl_SF_pi;
- , return cl_FF_pi;
- , return cl_DF_pi;
+ , return cl_SF_pi();
+ , return cl_FF_pi();
+ , return cl_DF_pi();
, return pi(len);
);
}
const cl_F pi (float_format_t f)
{
floatformatcase((uintC)f
- , return cl_SF_pi;
- , return cl_FF_pi;
- , return cl_DF_pi;
+ , return cl_SF_pi();
+ , return cl_FF_pi();
+ , return cl_DF_pi();
, return pi(len);
);
}
-// cl_SF_pi, cl_FF_pi, cl_DF_pi, cl_LF_pi.
+// cl_SF_pi(), cl_FF_pi(), cl_DF_pi(), cl_LF_pi().
// General includes.
#include "cl_sysdep.h"
-CL_PROVIDE(cl_F_pi_var)
// Specification.
#include "cl_F_tran.h"
namespace cln {
-// Mantisse von pi :
- static const uintD pi_mantisse [2048/intDsize] =
- #include "cl_F_pi_var.h"
-
-cl_LF cl_LF_pi = encode_LF_array(0,2,pi_mantisse,2048/intDsize);
+cl_LF& cl_LF_pi()
+{
+ // Mantisse von pi :
+ static const uintD pi_mantisse [2048/intDsize] =
+ #include "cl_F_pi_var.h"
+ static cl_LF val = encode_LF_array(0,2,pi_mantisse,2048/intDsize);
+ return val;
+}
// Problem: If someone changes free_hook, the destructor of this
// will call the new hook, passing it some pointer obtained by the old
// malloc_hook. ??
-const cl_SF cl_SF_pi = cl_LF_to_SF(cl_LF_pi);
-const cl_FF cl_FF_pi = cl_LF_to_FF(cl_LF_pi);
-const cl_DF cl_DF_pi = cl_LF_to_DF(cl_LF_pi);
+const cl_SF& cl_SF_pi()
+{
+ static const cl_SF val = cl_LF_to_SF(cl_LF_pi());
+ return val;
+}
+
+const cl_DF& cl_DF_pi()
+{
+ static const cl_DF val = cl_LF_to_DF(cl_LF_pi());
+ return val;
+}
+
+const cl_FF& cl_FF_pi()
+{
+ static const cl_FF val = cl_LF_to_FF(cl_LF_pi());
+ return val;
+}
} // namespace cln
-CL_PROVIDE_END(cl_F_pi_var)
namespace cln {
// pi.
-extern const cl_SF cl_SF_pi;
-extern const cl_FF cl_FF_pi;
-extern const cl_DF cl_DF_pi;
-extern cl_LF cl_LF_pi; // as long as it has ever been computed
+extern const cl_SF& cl_SF_pi();
+extern const cl_FF& cl_FF_pi();
+extern const cl_DF& cl_DF_pi();
+extern cl_LF& cl_LF_pi(); // as long as it has ever been computed
extern const cl_LF pi (uintC len); // computes it even further
-//CL_REQUIRE(cl_F_pi_var)
// cl_exp_aux(p,lq,len) liefert die Zahl exp(p/2^lq) mit len Digits.
// 0 < |p| < 2^lq.
const cl_LF pi (uintC len)
{
- var uintC oldlen = TheLfloat(cl_LF_pi)->len; // vorhandene Länge
+ var uintC oldlen = TheLfloat(cl_LF_pi())->len; // vorhandene Länge
if (len < oldlen)
- return shorten(cl_LF_pi,len);
+ return shorten(cl_LF_pi(),len);
if (len == oldlen)
- return cl_LF_pi;
+ return cl_LF_pi();
- // TheLfloat(cl_LF_pi)->len um mindestens einen konstanten Faktor
+ // TheLfloat(cl_LF_pi())->len um mindestens einen konstanten Faktor
// > 1 wachsen lassen, damit es nicht zu häufig nachberechnet wird:
var uintC newlen = len;
oldlen += floor(oldlen,2); // oldlen * 3/2
newlen = oldlen;
// gewünschte > vorhandene Länge -> muß nachberechnen:
- cl_LF_pi = compute_pi_ramanujan_163_fast(newlen);
- return (len < newlen ? shorten(cl_LF_pi,len) : cl_LF_pi);
+ cl_LF_pi() = compute_pi_ramanujan_163_fast(newlen);
+ return (len < newlen ? shorten(cl_LF_pi(),len) : cl_LF_pi());
}
} // namespace cln