4 #include "base/cl_sysdep.h"
7 #include "float/cl_F.h"
12 #include "float/dfloat/cl_DF.h"
13 #include "float/sfloat/cl_SF.h"
17 const cl_SF cl_DF_to_SF (const cl_DF& x)
22 #if (cl_word_size==64)
24 DF_decode(x, { return SF_0; }, sign=,exp=,mant=);
25 // 52-16=36 Bits wegrunden:
26 var const int shiftcount = DF_mant_len-SF_mant_len;
27 if ( ((mant & bit(shiftcount-1)) ==0) // Bit 35 war 0 -> abrunden
28 || ( ((mant & (bit(shiftcount-1)-1)) ==0) // war 1, Bits 34..0 >0 -> aufrunden
30 && ((mant & bit(shiftcount)) ==0)
33 { mant = mant >> shiftcount; }
36 { mant = mant >> shiftcount;
38 if (mant >= bit(SF_mant_len+1))
39 // Überlauf durchs Runden
40 { mant = mant>>1; exp = exp+1; } // Mantisse rechts schieben
42 return encode_SF(sign,exp,mant);
46 DF_decode2(x, { return SF_0; }, sign=,exp=,manthi=,mantlo=);
47 // 52-16=36 Bits wegrunden:
48 var const int shiftcount = DF_mant_len-SF_mant_len-32;
49 if ( ((manthi & bit(shiftcount-1)) ==0) // Bit 35 war 0 -> abrunden
50 || ( ((manthi & (bit(shiftcount-1)-1)) ==0) // war 1, Bits 34..0 >0 -> aufrunden
53 && ((manthi & bit(shiftcount)) ==0)
56 { manthi = manthi >> shiftcount; }
59 { manthi = manthi >> shiftcount;
61 if (manthi >= bit(SF_mant_len+1))
62 // Überlauf durchs Runden
63 { manthi = manthi>>1; exp = exp+1; } // Mantisse rechts schieben
65 return encode_SF(sign,exp,manthi);