]> www.ginac.de Git - cln.git/blob - src/float/lfloat/elem/cl_LF_ftrunc.cc
bump library version, since CLN doesn't export global object ctors any more.
[cln.git] / src / float / lfloat / elem / cl_LF_ftrunc.cc
1 // ftruncate().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cln/lfloat.h"
8
9
10 // Implementation.
11
12 #include "cl_LF.h"
13 #include "cl_LF_impl.h"
14 #include "cl_DS.h"
15
16 namespace cln {
17
18 const cl_LF ftruncate (const cl_LF& x)
19 {
20 // Methode:
21 // x = 0.0 oder e<=0 -> Ergebnis 0.0
22 // 1<=e<=16n -> letzte (16n-e) Bits der Mantisse auf 0 setzen,
23 //              Exponent und Vorzeichen beibehalten
24 // e>=16n -> Ergebnis x
25 #if 0
26       var cl_signean sign;
27       var sintE exp;
28       var const uintD* mantMSDptr;
29       var uintC mantlen;
30       LF_decode(x, { return x; }, sign=,exp=,mantMSDptr=,mantlen=,);
31       if (exp<=0) { return encode_LF0(mantlen); } // e<=0 -> Ergebnis 0.0
32       if ((uintE)exp >= intDsize*mantlen) // e>=16n -> x als Ergebnis
33         { return x; }
34         else
35         // 0 < e < 16n
36         // neue NUDS erzeugen mit e Bits aus mant und 16n-e Nullbits:
37         { CL_ALLOCA_STACK;
38           var uintD* MSDptr;
39           num_stack_alloc(mantlen, MSDptr=,);
40           { var uintC count = floor((uintE)exp,intDsize); // zu kopierende Digits, < mantlen
41             var uintC bitcount = ((uintE)exp) % intDsize; // zu kopierende Bits danach, >=0, <intDsize
42             var uintD* ptr =
43               copy_loop_msp(mantMSDptr,MSDptr,count); // count ganze Digits kopieren
44             msprefnext(ptr) = mspref(mantMSDptr,count) & minus_bitm(intDsize-bitcount); // dann bitcount Bits kopieren
45             clear_loop_msp(ptr,mantlen-count-1); // Rest mit Nullen füllen
46           }
47           return encode_LF(sign,exp,MSDptr,mantlen);
48         }
49 #else
50       var uintC len = TheLfloat(x)->len;
51       var uintE uexp = TheLfloat(x)->expo;
52       if (uexp <= LF_exp_mid)
53         { if (uexp == 0) { return x; } // x=0.0 -> Ergebnis 0.0
54           return encode_LF0(len); // e<=0 -> Ergebnis 0.0
55         }
56       var uintE exp = uexp - LF_exp_mid;
57       if (exp >= intDsize*len) // e>=16n -> x als Ergebnis
58         { return x; }
59       // 0 < e < 16n
60       var Lfloat y = allocate_lfloat(len,uexp,TheLfloat(x)->sign); // neues Long-Float
61       // y_mant := NUDS mit e Bits aus x_mant und 16n-e Nullbits:
62       {var uintC count = floor(exp,intDsize); // zu kopierende Digits, < mantlen
63        var uintC bitcount = exp % intDsize; // zu kopierende Bits danach, >=0, <intDsize
64        var const uintD* x_mantMSDptr = LF_MSDptr(x);
65        var uintD* ptr =
66          copy_loop_msp(x_mantMSDptr,arrayMSDptr(TheLfloat(y)->data,len),count); // count ganze Digits kopieren
67        msprefnext(ptr) = mspref(x_mantMSDptr,count) & minus_bitm(intDsize-bitcount); // dann bitcount Bits kopieren
68        clear_loop_msp(ptr,len-count-1); // Rest mit Nullen füllen
69       }
70       return y;
71 #endif
72 }
73
74 }  // namespace cln