17 const std::string &src,
20 unsigned &exponent_base,
21 bool &is_float,
bool &is_long,
bool &is_imaginary,
22 bool &is_decimal,
bool &is_float80,
bool &is_float128)
33 const char *p=src.c_str();
35 std::string str_whole_number,
43 if(src.size()>=2 && src[0]==
'0' && tolower(src[1])==
'x')
51 while(*p!=
'.' && *p!=0 && *p!=
'p' && *p!=
'P')
62 while(*p!=0 && *p!=
'p' && *p!=
'P')
64 str_fraction_part+=*p;
69 if(*p==
'p' || *p==
'P')
77 while(*p!=0 && *p!=
'f' && *p!=
'F' && *p!=
'l' && *p!=
'L' &&
78 *p!=
'w' && *p!=
'W' && *p!=
'q' && *p!=
'Q' && *p!=
'd' && *p!=
'D')
84 std::string str_number=str_whole_number+
91 if(str_number.empty())
96 if(str_exponent.empty())
102 exponent-=str_fraction_part.size()*4;
107 while(*p!=
'.' && *p!=0 && *p!=
'e' && *p!=
'E' &&
108 *p!=
'f' && *p!=
'F' && *p!=
'l' && *p!=
'L' &&
109 *p!=
'w' && *p!=
'W' && *p!=
'q' && *p!=
'Q' && *p!=
'd' && *p!=
'D' &&
110 *p!=
'i' && *p!=
'I' && *p!=
'j' && *p!=
'J')
112 str_whole_number+=*p;
121 while(*p!=0 && *p!=
'e' && *p!=
'E' &&
122 *p!=
'f' && *p!=
'F' && *p!=
'l' && *p!=
'L' &&
123 *p!=
'w' && *p!=
'W' && *p!=
'q' && *p!=
'Q' && *p!=
'd' && *p!=
'D' &&
124 *p!=
'i' && *p!=
'I' && *p!=
'j' && *p!=
'J')
126 str_fraction_part+=*p;
131 if(*p==
'e' || *p==
'E')
139 while(*p!=0 && *p!=
'f' && *p!=
'F' && *p!=
'l' && *p!=
'L' &&
140 *p!=
'w' && *p!=
'W' && *p!=
'q' && *p!=
'Q' && *p!=
'd' && *p!=
'D' &&
141 *p!=
'i' && *p!=
'I' && *p!=
'j' && *p!=
'J')
147 std::string str_number=str_whole_number+
150 if(str_number.empty())
155 if(str_exponent.empty())
161 exponent-=str_fraction_part.size();
165 is_float=is_long=is_imaginary=is_decimal=is_float80=is_float128=
false;
169 if(*p==
'f' || *p==
'F')
171 else if(*p==
'l' || *p==
'L')
173 else if(*p==
'i' || *p==
'I' || *p==
'j' || *p==
'J')
176 else if(*p==
'd' || *p==
'D')
179 is_decimal=is_decimal || *(p+1)!=0;
181 else if(*p==
'w' || *p==
'W')
183 else if(*p==
'q' || *p==
'Q')
void parse_float(const std::string &src, mp_integer &significand, mp_integer &exponent, unsigned &exponent_base, bool &is_float, bool &is_long, bool &is_imaginary, bool &is_decimal, bool &is_float80, bool &is_float128)
const mp_integer string2integer(const std::string &n, unsigned base)
ANSI-C Conversion / Type Checking.