diff --git a/include/cln/float.h b/include/cln/float.h index e262ca0..48a83b8 100644 --- a/include/cln/float.h +++ b/include/cln/float.h @@ -602,8 +602,6 @@ extern const cl_F pi (float_format_t f); // 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); diff --git a/src/float/transcendental/cl_F_pi.cc b/src/float/transcendental/cl_F_pi.cc index 217d2c8..7d2f8ce 100644 --- a/src/float/transcendental/cl_F_pi.cc +++ b/src/float/transcendental/cl_F_pi.cc @@ -18,9 +18,9 @@ namespace cln { 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); ); } diff --git a/src/float/transcendental/cl_F_pi_def.cc b/src/float/transcendental/cl_F_pi_def.cc index 73e1e34..d2f6568 100644 --- a/src/float/transcendental/cl_F_pi_def.cc +++ b/src/float/transcendental/cl_F_pi_def.cc @@ -17,9 +17,9 @@ namespace cln { 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); ); } diff --git a/src/float/transcendental/cl_F_pi_f.cc b/src/float/transcendental/cl_F_pi_f.cc index d6ea053..a94d8f2 100644 --- a/src/float/transcendental/cl_F_pi_f.cc +++ b/src/float/transcendental/cl_F_pi_f.cc @@ -17,9 +17,9 @@ namespace cln { 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); ); } diff --git a/src/float/transcendental/cl_F_pi_var.cc b/src/float/transcendental/cl_F_pi_var.cc index bbcb8ea..567a94a 100644 --- a/src/float/transcendental/cl_F_pi_var.cc +++ b/src/float/transcendental/cl_F_pi_var.cc @@ -1,9 +1,8 @@ -// 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" @@ -18,20 +17,36 @@ CL_PROVIDE(cl_F_pi_var) 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) diff --git a/src/float/transcendental/cl_F_tran.h b/src/float/transcendental/cl_F_tran.h index daa5a95..451daa6 100644 --- a/src/float/transcendental/cl_F_tran.h +++ b/src/float/transcendental/cl_F_tran.h @@ -9,12 +9,11 @@ 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. diff --git a/src/float/transcendental/cl_LF_pi.cc b/src/float/transcendental/cl_LF_pi.cc index 248e75e..78f625c 100644 --- a/src/float/transcendental/cl_LF_pi.cc +++ b/src/float/transcendental/cl_LF_pi.cc @@ -260,13 +260,13 @@ const cl_LF compute_pi_ramanujan_163_fast (uintC len) 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 @@ -274,8 +274,8 @@ const cl_LF pi (uintC len) 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