4 #include "base/cl_sysdep.h"
7 #include "cln/sfloat.h"
12 #include "float/sfloat/cl_SF.h"
13 #include "float/dfloat/cl_DF.h"
17 double double_approx (const cl_SF& x)
23 SF_decode(x, { return 0.0; }, sign=,exp=,mant=);
24 // Mantisse um 52-16=36 Nullbits erweitern:
25 union { dfloat eksplicit; double machine_double; } u;
26 #if (cl_word_size==64)
27 if (((sintL)(SF_exp_high-SF_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)(SF_exp_low-SF_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-SF_mant_len)) & (bit(DF_mant_len)-1)); /* Mantisse */
44 if (((sintL)(SF_exp_high-SF_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)(SF_exp_low-SF_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<<(DF_mant_len-SF_mant_len-32)) & (bit(DF_mant_len-32)-1)); /* Mantisse */
65 return u.machine_double;