Floating Point Unit
- atof() benutzen?
- nur single-precision? (7..8 Dezimalstellen, H7 hat double precision FPU)
- kein eigener Stack
- >float wo?
- float register mit mutex absichern?
- float.fs in source integrieren?
- auf float in ISR verzichten
- _FPU_USED
- AN4044 Application note, Foating point unit demonstration on STM32 microcontrollers
>float
in Gforth engine/support.c verwendet
strtod()
(
strtof()
for single precision)
Cell to_float(Char *c_addr, UCell u, Float *rp)
{
/* convertible string := <significand>[<exponent>]
<significand> := [<sign>]{<digits>[.<digits0>] | .<digits> }
<exponent> := <marker><digits0>
<marker> := {<e-form> | <sign-form>}
<e-form> := <e-char>[<sign-form>]
<sign-form> := { + | - }
<e-char> := { D | d | E | e }
*/
Char *s = c_addr;
Char c;
Char *send = c_addr+u;
UCell ndigits = 0;
UCell ndots = 0;
UCell edigits = 0;
char cnum[u+3]; /* append at most "e0\0" */
char *t=cnum;
char *endconv;
Float r;
if (s >= send) /* treat empty string as 0e */
goto return0;
switch ((c=*s)) {
case ' ':
/* "A string of blanks should be treated as a special case
representing zero."*/
for (s++; s<send; )
if (*s++ != ' ')
goto error;
goto return0;
case '-':
case '+': *t++ = c; s++; goto aftersign;
}
aftersign:
if (s >= send)
goto exponent;
switch (c=*s) {
case '0' ... '9': *t++ = c; ndigits++; s++; goto aftersign;
case '.': *t++ = c; ndots++; s++; goto aftersign;
default: goto exponent;
}
exponent:
if (ndigits < 1 || ndots > 1)
goto error;
*t++ = 'E';
if (s >= send)
goto done;
switch (c=*s) {
case 'D':
case 'd':
case 'E':
case 'e': s++; break;
}
if (s >= send)
goto done;
switch (c=*s) {
case '+':
case '-': *t++ = c; s++; break;
}
edigits0:
if (s >= send)
goto done;
switch (c=*s) {
case '0' ... '9': *t++ = c; s++; edigits++; goto edigits0;
default: goto error;
}
done:
if (edigits == 0)
*t++ = '0';
*t++ = '\0';
assert(t-cnum <= u+3);
r = strtod(cnum, &endconv);
assert(*endconv == '\0');
*rp = r;
return -1;
return0:
*rp = 0.0;
return -1;
error:
*rp = 0.0;
return 0;
}
#endif
--
Peter Schmid - 2020-10-27
Comments