7 #include "cln/lfloat.h"
13 #include "cl_LF_impl.h"
18 const cl_LF ftruncate (const cl_LF& x)
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
28 var const uintD* mantMSDptr;
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
36 // neue NUDS erzeugen mit e Bits aus mant und 16n-e Nullbits:
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
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
47 return encode_LF(sign,exp,MSDptr,mantlen);
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
56 var uintE exp = uexp - LF_exp_mid;
57 if (exp >= intDsize*len) // e>=16n -> x als Ergebnis
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);
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