EK
float char_to_float(char const* s)
{
// First part (before 'e')
int x = 0, n = 0;
bool neg = false;
if (*s == '-') { neg = true; s++; }
else if (*s == '+') { s++; }
x = (*s++ - '0');
s++; // skip point
while (*s != 'e') {
x *= 10;
x += (*s++ - '0');
++n;
}
*s++; // skip 'e'
if (neg) { x = - x; }
// Second part (after 'e')
int e = 0;
neg = (*s++ == '-'); // sign is always present
e = (s[0]*10 + s[1]) - ('0'*10+'0');
/* если могут быть не только 2 цифры экспоненты (тогда предыдущую строку 'e=...' закомментировать, а while раскомментировать)
while (*s) {
e *= 10;
e += (*s++ - '0');
}
*/
if (neg) { e = - e; }
e -= n;
if (e < 0) {
neg = true;
e = - e;
}
// Calc 10^e
float p = 1, z = neg ? 0.1f : 10.f;
while (e) {
if (e & 1) { p *= z; }
z *= z;
e >>= 1;
}
return x * p;
}
#include <iostream>
#include <iomanip>
int main()
{
std::cout << std::setprecision(10) << char_to_float("-1.2345678e+02") << std::endl;
return 0;
}




