4 #include "base/cl_sysdep.h"
7 #include "cln/float_io.h"
12 #include "cln/integer.h"
13 #include "integer/cl_I.h"
14 #include "cln/rational.h"
15 #include "rational/cl_RA.h"
16 #include "cln/float.h"
17 #include "cln/sfloat.h"
18 #include "cln/ffloat.h"
19 #include "cln/dfloat.h"
20 #include "cln/lfloat.h"
21 #include "float/cl_F.h"
22 #include "float/sfloat/cl_SF.h"
23 #include "float/ffloat/cl_FF.h"
24 #include "float/dfloat/cl_DF.h"
25 #include "float/lfloat/cl_LF.h"
29 #if intCsize > intLsize
30 const cl_F read_float (unsigned int base, float_format_t prec, cl_signean sign, const char * string, uintL index1, uintL index4, uintL index2, uintL index3)
32 // XXX: This signature is for binary compatibility with CLN-1.2.0 only.
33 return read_float(base, prec, sign, string, uintC(index1), uintC(index4), uintC(index2), uintC(index3));
37 const cl_F read_float (unsigned int base, float_format_t prec, cl_signean sign, const char * string, uintC index1, uintC index4, uintC index2, uintC index3)
41 var uintC exp_len = index2-index4; // Anzahl Stellen des Exponenten
43 var const char * ptr = &string[index4]; // zeigt auf den Exponentmarker
44 ptr++; exp_len--; // Exponentmarker überlesen
45 var cl_signean exp_sign = 0; // Exponenten-Vorzeichen
47 case '-': exp_sign = ~exp_sign; // Vorzeichen := negativ
48 case '+': ptr++; exp_len--; // Exponenten-Vorzeichen überlesen
51 exponent = digits_to_I(ptr,exp_len,(uintD)base); // Exponent in Integer umwandeln
53 exponent = -exponent; // incl. Vorzeichen
59 // exponent = Exponent als Integer.
60 var cl_RA base_power = expt(base,exponent-(index4-index3)); // zu multiplizierende Zehnerpotenz
61 var cl_I mantisse = // Mantisse als Integer
62 digits_to_I(&string[index1],index4-index1,(uintD)base);
63 // Mantisse (Integer) und Zehnerpotenz (rational >0) unelegant zusammenmultiplizieren:
65 if (integerp(base_power)) {
66 DeclareType(cl_I,base_power);
67 ratvalue = mantisse * base_power;
69 // falls mantisse/=0, in exponent=1/10^i den Zähler durch mantisse
70 // ersetzen (liefert ungekürzten Bruch, Vorsicht!)
71 DeclareType(cl_RT,base_power);
75 ASSERT(TheRatio(base_power)->refcount == 1);
76 TheRatio(base_power)->numerator = mantisse;
77 ratvalue = base_power;
80 // ratvalue = Mantisse * Zehnerpotenz, als ungekürzte rationale Zahl!
82 , // in Short-Float umwandeln
84 var cl_SF x = cl_RA_to_SF(ratvalue);
85 if (sign==0) { return x; } else { return -x; }
87 , // in Single-Float umwandeln
89 var cl_FF x = cl_RA_to_FF(ratvalue);
90 if (sign==0) { return x; } else { return -x; }
92 , // in Double-Float umwandeln
94 var cl_DF x = cl_RA_to_DF(ratvalue);
95 if (sign==0) { return x; } else { return -x; }
97 , // in Long-Float umwandeln
99 var cl_LF x = cl_RA_to_LF(ratvalue,len);
100 if (sign==0) { return x; } else { return -x; }