static void flipped_double (void)
{
typedef struct { unsigned lo, hi; } dfloat;
- double x = 2;
- dfloat test = *(dfloat*)&x;
+ union { dfloat eksplicit; double machine_double; } x;
+ x.machine_double = 2;
+ dfloat test = x.eksplicit;
if (test.lo==0 && test.hi!=0) {
printf("#define double_wordorder_bigendian_p 0\n");
} else if (test.lo!=0 && test.hi==0) {
// Constructors and assignment operators from C numeric types.
// from `float':
-union ffloatjanus;
-extern cl_private_thing cl_float_to_FF_pointer (const union ffloatjanus& val);
+extern cl_private_thing cl_float_to_FF_pointer (const float val);
#define CL_DEFINE_FLOAT_CONSTRUCTOR(_class_) \
inline _class_ :: _class_ (const float x) \
{ \
- pointer = cl_float_to_FF_pointer(*(const union ffloatjanus *)&x); \
+ pointer = cl_float_to_FF_pointer(x); \
} \
inline _class_& _class_::operator= (const float x) \
{ \
cl_dec_refcount(*this); \
- pointer = cl_float_to_FF_pointer(*(const union ffloatjanus *)&x); \
+ pointer = cl_float_to_FF_pointer(x); \
return *this; \
}
// from `double':
-union dfloatjanus;
-extern struct cl_heap_dfloat * cl_double_to_DF_pointer (const union dfloatjanus& val);
+extern struct cl_heap_dfloat * cl_double_to_DF_pointer (const double val);
#define CL_DEFINE_DOUBLE_CONSTRUCTOR(_class_) \
inline _class_::_class_ (const double x) \
{ \
- pointer = cl_double_to_DF_pointer(*(const union dfloatjanus *)&x); \
+ pointer = cl_double_to_DF_pointer(x); \
} \
inline _class_& _class_::operator= (const double x) \
{ \
cl_dec_refcount(*this); \
- pointer = cl_double_to_DF_pointer(*(const union dfloatjanus *)&x); \
+ pointer = cl_double_to_DF_pointer(x); \
return *this; \
}
// e=2047, m=0: vorzeichenbehaftete Infinity
// e=2047, m/=0: NaN
-// cl_double_to_DF(val) wandelt ein IEEE-Double-Float val in ein Double-Float um.
-extern cl_heap_dfloat* cl_double_to_DF_pointer (const dfloatjanus& val);
-inline const cl_DF cl_double_to_DF (const dfloatjanus& val)
- { return cl_double_to_DF_pointer(val); }
+// cl_double_to_DF_pointer(val) wandelt ein IEEE-Double-Float val in ein Double-Float um.
+extern cl_heap_dfloat* cl_double_to_DF_pointer (const double val);
// cl_DF_to_double(obj,&val);
// wandelt ein Double-Float obj in ein IEEE-Double-Float val um.
-// cl_double_to_FF().
+// cl_double_to_DF_pointer().
+
+// Ensure that union dfloatjanus has a 'double' alternative.
+#define FAST_DOUBLE
// General includes.
#include "cl_sysdep.h"
namespace cln {
-cl_heap_dfloat* cl_double_to_DF_pointer (const dfloatjanus& val_)
+cl_heap_dfloat* cl_double_to_DF_pointer (const double x)
{
+ var union dfloatjanus val_;
+ val_.machine_double = x;
var dfloat val = val_.eksplicit;
#if (cl_word_size==64)
var uintL exp = (val >> DF_mant_len) & (bit(DF_exp_len)-1); // e
// e=255, m=0: vorzeichenbehaftete Infinity
// e=255, m/=0: NaN
-// cl_float_to_FF(val) wandelt ein IEEE-Single-Float val in ein Single-Float um.
-extern cl_private_thing cl_float_to_FF_pointer (const ffloatjanus& val);
-inline const cl_FF cl_float_to_FF (const ffloatjanus& val)
- { return cl_float_to_FF_pointer(val); }
+// cl_float_to_FF_pointer(val) wandelt ein IEEE-Single-Float val in ein Single-Float um.
+extern cl_private_thing cl_float_to_FF_pointer (const float val);
// cl_FF_to_float(obj,&val);
// wandelt ein Single-Float obj in ein IEEE-Single-Float val um.
-// cl_float_to_FF().
+// cl_float_to_FF_pointer().
+
+// Ensure that union ffloatjanus has a 'float' alternative.
+#define FAST_FLOAT
// General includes.
#include "cl_sysdep.h"
// Implementation.
-cl_private_thing cl_float_to_FF_pointer (const ffloatjanus& val_)
+cl_private_thing cl_float_to_FF_pointer (const float x)
{
+ var union ffloatjanus val_;
+ val_.machine_float = x;
var ffloat val = val_.eksplicit;
var uintL exp = (val >> FF_mant_len) & (bit(FF_exp_len)-1); // e
if (exp == 0) // e=0 ?