]> www.ginac.de Git - cln.git/blob - cl_float_format.cc
5bfbf60a0274a38ac9e9b979f04b142ec52b02e9
[cln.git] / cl_float_format.cc
1 // float_format().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cln/float.h"
8
9
10 // Implementation.
11
12 namespace cln {
13
14 float_format_t float_format (uintL n)
15 {
16 // Methode:
17 // Mindestens 1+n Dezimalstellen (inklusive Vorkommastelle)
18 // bedeutet mindestens ceiling((1+n)*ln(10)/ln(2)) Binärstellen.
19 // ln(10)/ln(2) = 3.321928095 = (binär) 11.01010010011010011110000100101111...
20 //                       = (binär) 100 - 0.10101101100101100001111011010001
21 // Durch diese Berechnungsmethode wird das Ergebnis sicher >= (1+n)*ln(10)/ln(2)
22 // sein, evtl. um ein paar Bit zu groß, aber nicht zu klein.
23         n = 1+n;
24         return (float_format_t)
25                ((n << 2)
26                 - (n >> 1) - (n >> 3) - (n >> 5) - (n >> 6) - (n >> 8)
27                 - (n >> 9) - (n >> 12) - (n >> 14) - (n >> 15)
28                );
29 }
30
31 }  // namespace cln