Browse Source

Get rid of CL_REQUIRE/CL_PROVIDE(cl_F_ln10_var).

Turn cl_[SDFL]F_ln10 global variables into functions (which return a constant
reference to the static value) in order to avoid static initialization order
problems.
master
Alexei Sheplyakov 17 years ago
parent
commit
eedac861e0
  1. 1
      src/float/output/cl_F_dprint.cc
  2. 6
      src/float/transcendental/cl_F_ln10.cc
  3. 6
      src/float/transcendental/cl_F_ln10_f.cc
  4. 30
      src/float/transcendental/cl_F_ln10_var.cc
  5. 9
      src/float/transcendental/cl_F_tran.h
  6. 12
      src/float/transcendental/cl_LF_ln10.cc

1
src/float/output/cl_F_dprint.cc

@ -28,7 +28,6 @@
// einen String mit seiner Dezimaldarstellung. // einen String mit seiner Dezimaldarstellung.
// (substring string start [end]) wie subseq, jedoch für Strings schneller. // (substring string start [end]) wie subseq, jedoch für Strings schneller.
CL_REQUIRE(cl_F_ln10_var)
#include <cstring> #include <cstring>
#include "cln/output.h" #include "cln/output.h"
#include "cl_sstring.h" #include "cl_sstring.h"

6
src/float/transcendental/cl_F_ln10.cc

@ -17,9 +17,9 @@ namespace cln {
const cl_F cl_ln10 (const cl_F& y) const cl_F cl_ln10 (const cl_F& y)
{ {
floattypecase(y floattypecase(y
, return cl_SF_ln10;
, return cl_FF_ln10;
, return cl_DF_ln10;
, return cl_SF_ln10();
, return cl_FF_ln10();
, return cl_DF_ln10();
, return cl_ln10(TheLfloat(y)->len); , return cl_ln10(TheLfloat(y)->len);
); );
} }

6
src/float/transcendental/cl_F_ln10_f.cc

@ -16,9 +16,9 @@ namespace cln {
const cl_F cl_ln10 (float_format_t f) const cl_F cl_ln10 (float_format_t f)
{ {
floatformatcase((uintC)f floatformatcase((uintC)f
, return cl_SF_ln10;
, return cl_FF_ln10;
, return cl_DF_ln10;
, return cl_SF_ln10();
, return cl_FF_ln10();
, return cl_DF_ln10();
, return cl_ln10(len); , return cl_ln10(len);
); );
} }

30
src/float/transcendental/cl_F_ln10_var.cc

@ -3,8 +3,6 @@
// General includes. // General includes.
#include "cl_sysdep.h" #include "cl_sysdep.h"
CL_PROVIDE(cl_F_ln10_var)
// Specification. // Specification.
#include "cl_F_tran.h" #include "cl_F_tran.h"
@ -18,20 +16,36 @@ CL_PROVIDE(cl_F_ln10_var)
namespace cln { namespace cln {
cl_LF& cl_LF_ln10()
{
// Mantisse von ln(10) : // Mantisse von ln(10) :
static const uintD ln10_mantisse [64/intDsize] = static const uintD ln10_mantisse [64/intDsize] =
#include "cl_F_ln10_var.h" #include "cl_F_ln10_var.h"
cl_LF cl_LF_ln10 = encode_LF_array(0,2,ln10_mantisse,64/intDsize);
static cl_LF val = encode_LF_array(0,2,ln10_mantisse,64/intDsize);
return val;
}
// Problem: If someone changes free_hook, the destructor of this // Problem: If someone changes free_hook, the destructor of this
// will call the new hook, passing it some pointer obtained by the old // will call the new hook, passing it some pointer obtained by the old
// malloc_hook. ?? // malloc_hook. ??
const cl_SF cl_SF_ln10 = cl_LF_to_SF(cl_LF_ln10);
const cl_FF cl_FF_ln10 = cl_LF_to_FF(cl_LF_ln10);
const cl_DF cl_DF_ln10 = cl_LF_to_DF(cl_LF_ln10);
const cl_SF& cl_SF_ln10()
{
static const cl_SF val = cl_LF_to_SF(cl_LF_ln10());
return val;
}
const cl_FF& cl_FF_ln10()
{
static const cl_FF val = cl_LF_to_FF(cl_LF_ln10());
return val;
}
const cl_DF& cl_DF_ln10()
{
static const cl_DF val = cl_LF_to_DF(cl_LF_ln10());
return val;
}
} // namespace cln } // namespace cln
CL_PROVIDE_END(cl_F_ln10_var)

9
src/float/transcendental/cl_F_tran.h

@ -99,12 +99,11 @@ extern const cl_F cl_ln2 (const cl_F& y);
extern const cl_F cl_ln2 (float_format_t f); extern const cl_F cl_ln2 (float_format_t f);
// ln(10). // ln(10).
extern const cl_SF cl_SF_ln10;
extern const cl_FF cl_FF_ln10;
extern const cl_DF cl_DF_ln10;
extern cl_LF cl_LF_ln10; // as long as it has ever been computed
extern const cl_SF& cl_SF_ln10();
extern const cl_FF& cl_FF_ln10();
extern const cl_DF& cl_DF_ln10();
extern cl_LF& cl_LF_ln10(); // as long as it has ever been computed
extern const cl_LF cl_ln10 (uintC len); // computes it even further extern const cl_LF cl_ln10 (uintC len); // computes it even further
//CL_REQUIRE(cl_F_ln10_var)
// cl_ln10(y) liefert die Zahl ln(10) im selben Float-Format wie y. // cl_ln10(y) liefert die Zahl ln(10) im selben Float-Format wie y.
// > y: ein Float // > y: ein Float

12
src/float/transcendental/cl_LF_ln10.cc

@ -48,13 +48,13 @@ static inline const cl_LF compute_ln10_p2357 (uintC len)
const cl_LF cl_ln10 (uintC len) const cl_LF cl_ln10 (uintC len)
{ {
var uintC oldlen = TheLfloat(cl_LF_ln10)->len; // vorhandene Länge
var uintC oldlen = TheLfloat(cl_LF_ln10())->len; // vorhandene Länge
if (len < oldlen) if (len < oldlen)
return shorten(cl_LF_ln10,len);
return shorten(cl_LF_ln10(),len);
if (len == oldlen) if (len == oldlen)
return cl_LF_ln10;
return cl_LF_ln10();
// TheLfloat(cl_LF_ln10)->len um mindestens einen konstanten Faktor
// TheLfloat(cl_LF_ln10())->len um mindestens einen konstanten Faktor
// > 1 wachsen lassen, damit es nicht zu häufig nachberechnet wird: // > 1 wachsen lassen, damit es nicht zu häufig nachberechnet wird:
var uintC newlen = len; var uintC newlen = len;
oldlen += floor(oldlen,2); // oldlen * 3/2 oldlen += floor(oldlen,2); // oldlen * 3/2
@ -62,8 +62,8 @@ const cl_LF cl_ln10 (uintC len)
newlen = oldlen; newlen = oldlen;
// gewünschte > vorhandene Länge -> muß nachberechnen: // gewünschte > vorhandene Länge -> muß nachberechnen:
cl_LF_ln10 = compute_ln10(newlen);
return (len < newlen ? shorten(cl_LF_ln10,len) : cl_LF_ln10);
cl_LF_ln10() = compute_ln10(newlen);
return (len < newlen ? shorten(cl_LF_ln10(),len) : cl_LF_ln10());
} }
} // namespace cln } // namespace cln
Loading…
Cancel
Save