4 #include "base/cl_sysdep.h"
7 #include "cln/ffloat.h"
12 #include "float/ffloat/cl_FF.h"
13 #include "float/dfloat/cl_DF.h"
17 double double_approx (const cl_FF& x)
23 FF_decode(x, { return 0.0; }, sign=,exp=,mant=);
24 // Mantisse um 52-23=29 Nullbits erweitern:
25 union { dfloat eksplicit; double machine_double; } u;
26 #if (cl_word_size==64)
27 if (((sintL)(FF_exp_high-FF_exp_mid) > (sintL)(DF_exp_high-DF_exp_mid))
28 && (exp > (sintL)(DF_exp_high-DF_exp_mid)))
30 ((sint64)sign & bit(63))
31 | ((uint64)(bit(DF_exp_len)-1) << DF_mant_len); // Infinity
34 if (((sintL)(FF_exp_low-FF_exp_mid) < (sintL)(DF_exp_low-DF_exp_mid))
35 && (exp < (sintL)(DF_exp_low-DF_exp_mid)))
36 { u.eksplicit = ((sint64)sign & bit(63)); } // 0.0
39 ((sint64)sign & bit(63)) /* Vorzeichen */
40 | ((uint64)(exp+DF_exp_mid) << DF_mant_len) /* Exponent */
41 | (((uint64)mant<<(DF_mant_len-FF_mant_len)) & (bit(DF_mant_len)-1)); /* Mantisse */
44 if (((sintL)(FF_exp_high-FF_exp_mid) > (sintL)(DF_exp_high-DF_exp_mid))
45 && (exp > (sintL)(DF_exp_high-DF_exp_mid)))
47 ((sint32)sign & bit(31))
48 | ((uint32)(bit(DF_exp_len)-1) << (DF_mant_len-32)); // Infinity
52 if (((sintL)(FF_exp_low-FF_exp_mid) < (sintL)(DF_exp_low-DF_exp_mid))
53 && (exp < (sintL)(DF_exp_low-DF_exp_mid)))
54 { u.eksplicit.semhi = ((sint32)sign & bit(31)); // 0.0
59 ((sint32)sign & bit(31)) /* Vorzeichen */
60 | ((uint32)(exp+DF_exp_mid) << (DF_mant_len-32)) /* Exponent */
61 | (((uint32)mant>>(32-(DF_mant_len-FF_mant_len))) & (bit(DF_mant_len-32)-1)); /* Mantisse */
62 u.eksplicit.mlo = mant<<(DF_mant_len-FF_mant_len);
65 return u.machine_double;