blob: acb081e517c2a3079fe0113f77ceca9d86c71b3d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
float strtof(const char* s, char** endptr) {
register const char* p = s;
register float value = 0.;
int sign = +1;
float factor;
unsigned int expo;
while ( isspace(*p) )
p++;
switch (*p) {
case '-': sign = -1;
case '+': p++;
default : break;
}
while ( (unsigned int)(*p - '0') < 10u )
value = value*10 + (*p++ - '0');
if ( *p == '.' ) {
factor = 1.;
p++;
while ( (unsigned int)(*p - '0') < 10u ) {
factor *= 0.1;
value += (*p++ - '0') * factor;
}
}
if ( (*p | 32) == 'e' ) {
expo = 0;
factor = 10.L;
switch (*++p) { // ja hier weiß ich nicht, was mindestens nach einem 'E' folgenden MUSS.
case '-': factor = 0.1;
case '+': p++;
break;
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
break;
default : value = 0.L;
p = s;
goto done;
}
while ( (unsigned int)(*p - '0') < 10u )
expo = 10 * expo + (*p++ - '0');
while ( 1 ) {
if ( expo & 1 )
value *= factor;
if ( (expo >>= 1) == 0 )
break;
factor *= factor;
}
}
done:
if ( endptr != NULL )
*endptr = (char*)p;
return value * sign;
}
|