]> www.ginac.de Git - cln.git/blob - src/float/conv/cl_FF_to_float.cc
Finalize CLN 1.3.7 release.
[cln.git] / src / float / conv / cl_FF_to_float.cc
1 // cl_FF_to_float().
2
3 // General includes.
4 #include "base/cl_sysdep.h"
5
6 // Specification.
7 #include "cln/ffloat.h"
8
9
10 // Implementation.
11
12 #include "float/ffloat/cl_FF.h"
13
14 namespace cln {
15
16 float float_approx (const cl_FF& obj)
17 {
18         union { ffloat eksplicit; float machine_float; } u;
19         #define val u.eksplicit
20         val = cl_ffloat_value(obj);
21         // Der Exponent muß um FF_exp_mid-126 erniedrigt werden.
22         if (FF_exp_mid>126)
23           { var uintL exp = (val >> FF_mant_len) & (bit(FF_exp_len)-1); // e
24             if (exp < FF_exp_mid-126+1)
25               { // produziere denormalisiertes Float
26                 val = (val & minus_bit(FF_exp_len+FF_mant_len)) // selbes Vorzeichen
27                       | (0 << FF_mant_len) // Exponent 0
28                       | (((val & (bit(FF_mant_len)-1)) | bit(FF_mant_len)) // Mantisse shiften
29                          >> (FF_exp_mid-126+1 - exp) // shiften
30                         );
31               }
32               else
33               { val -= (FF_exp_mid - 126) << FF_mant_len; }
34           }
35         #undef val
36         return u.machine_float;
37 }
38
39 }  // namespace cln