4 #include "base/cl_sysdep.h"
7 #include "cln/lfloat.h"
12 #include "float/lfloat/cl_LF.h"
13 #include "float/lfloat/cl_LF_impl.h"
14 #include "float/cl_F.h"
15 #include "integer/cl_I.h"
19 const cl_LF scale_float (const cl_LF& x, const cl_I& delta)
22 // delta=0 -> x als Ergebnis
23 // x=0.0 -> x als Ergebnis
24 // delta muß ein Integer betragsmäßig <= LF_exp_high-LF_exp_low sein.
25 // Neues LF mit um delta vergrößertem Exponenten bilden.
26 if (eq(delta,0)) { return x; } // delta=0 -> x als Ergebnis
27 var uintE uexp = TheLfloat(x)->expo;
28 if (uexp==0) { return x; }
30 // |delta| muß <= LF_exp_high-LF_exp_low < 2^intEsize sein.
33 var sintV sdelta = FN_to_V(delta);
35 { udelta = sdelta; goto pos; }
37 { udelta = sdelta; goto neg; }
40 var cl_heap_bignum* bn = TheBignum(delta);
41 if ((sintD)mspref(arrayMSDptr(bn->data,bn->length),0) >= 0) {
44 udelta = cl_I_to_UE(delta);
46 } catch (const runtime_exception&) {
52 udelta = cl_I_to_E(delta);
54 } catch (const runtime_exception&) {
60 pos: // udelta = delta >=0
61 if ( ((uexp = uexp+udelta) < udelta) // Exponent-Überlauf?
62 || (uexp > LF_exp_high) // oder Exponent zu groß?
65 { throw floating_point_overflow_exception(); }
68 neg: // delta <0, udelta = 2^intEsize+delta
69 if ( ((uexp = uexp+udelta) >= udelta) // oder Exponent-Unterlauf?
70 || (uexp < LF_exp_low) // oder Exponent zu klein?
73 { if (underflow_allowed())
74 { throw floating_point_underflow_exception(); }
76 { return encode_LF0(TheLfloat(x)->len); } // Ergebnis 0.0
81 var uintC len = TheLfloat(x)->len;
82 return encode_LFu(TheLfloat(x)->sign,uexp,arrayMSDptr(TheLfloat(x)->data,len),len);