]> www.ginac.de Git - cln.git/blob - src/float/conv/cl_LF_to_FF.cc
Initial revision
[cln.git] / src / float / conv / cl_LF_to_FF.cc
1 // cl_LF_to_FF().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_F.h"
8
9
10 // Implementation.
11
12 #include "cl_LF.h"
13 #include "cl_LF_impl.h"
14 #include "cl_FF.h"
15 #include "cl_DS.h"
16
17 const cl_FF cl_LF_to_FF (const cl_LF& x)
18 {
19         // x entpacken:
20         var cl_signean sign;
21         var sintL exp;
22         var uintD* ptr;
23         var uintC len;
24         LF_decode(x, { return cl_FF_0; }, sign=,exp=,ptr=,len=,);
25         // intDsize*len-FF_mant_len-1 Bits der Mantisse wegrunden:
26         // erste k := ceiling(FF_mant_len+2,intDsize) Digits nach mant holen:
27         #if (intDsize==64)
28         var uint64 mant = get_max64_Dptr(FF_mant_len+2,ptr);
29         #else
30         var uint32 mant = get_max32_Dptr(FF_mant_len+2,ptr);
31         #endif
32         ptr = ptr mspop ceiling(FF_mant_len+2,intDsize);
33         var const int shiftcount = ceiling(FF_mant_len+2,intDsize)*intDsize-(FF_mant_len+1);
34         if ( ((mant & bit(shiftcount-1)) ==0) // Bit 7 war 0 -> abrunden
35              || ( ((mant & (bit(shiftcount-1)-1)) ==0) // war 1, Bits 6..0 >0 -> aufrunden
36                   && !test_loop_msp(ptr,len-ceiling(FF_mant_len+2,intDsize)) // weitere Bits /=0 -> aufrunden
37                   // round-to-even
38                   && ((mant & bit(shiftcount)) ==0)
39            )    )
40           // abrunden
41           { mant = mant >> shiftcount; }
42           else
43           // aufrunden
44           { mant = mant >> shiftcount;
45             mant = mant+1;
46             if (mant >= bit(FF_mant_len+1))
47               // Überlauf durchs Runden
48               { mant = mant>>1; exp = exp+1; } // Mantisse rechts schieben
49           }
50         return encode_FF(sign,exp,mant);
51 }