]> www.ginac.de Git - cln.git/blob - src/float/sfloat/elem/cl_SF_scale_I.cc
Initial revision
[cln.git] / src / float / sfloat / elem / cl_SF_scale_I.cc
1 // scale_float().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_sfloat.h"
8
9
10 // Implementation.
11
12 #include "cl_SF.h"
13 #include "cl_F.h"
14 #include "cl_I.h"
15
16 const cl_SF scale_float (const cl_SF& x, const cl_I& delta)
17 {
18   // Methode:
19   // x=0.0 -> x als Ergebnis
20   // delta muß ein Fixnum betragsmäßig <= SF_exp_high-SF_exp_low sein.
21   // Neues SF mit um delta vergrößertem Exponenten bilden.
22       // x entpacken:
23       var cl_signean sign;
24       var sintL exp;
25       var uint32 mant;
26       SF_decode(x, { return x; }, sign=,exp=,mant=);
27       if (!minusp(delta))
28         // delta>=0
29         { var uintL udelta;
30           if (fixnump(delta)
31               && ((udelta = FN_to_L(delta)) <= (uintL)(SF_exp_high-SF_exp_low))
32              )
33             { exp = exp+udelta;
34               return encode_SF(sign,exp,mant);
35             }
36             else
37             { cl_error_floating_point_overflow(); }
38         }
39         else
40         // delta<0
41         { var uintL udelta;
42           if (fixnump(delta)
43               && ((udelta = -FN_to_L(delta)) <= (uintL)(SF_exp_high-SF_exp_low))
44               && ((cl_value_len+1<intLsize) || !(udelta==0))
45              )
46             { exp = exp-udelta;
47               return encode_SF(sign,exp,mant);
48             }
49             else
50             if (underflow_allowed())
51               { cl_error_floating_point_underflow(); }
52               else
53               { return SF_0; }
54         }
55 }