MULTI
, SINGLE
, or INIT-MULTI
.
>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
f+ ( r1 r2 -- r3 ) Add r1 to r2 giving the sum r3. f- ( r1 r2 -- r3 ) Subtract r2 from r1, giving r3. f* ( r1 r2 -- r3 ) Multiply r1 by r2 giving r3. f/ ( r1 r2 -- r3 ) Divide r1 by r2, giving the quotient r3. fsqrt ( r1 -- r2 ) r2 is the square root of r1. fabs ( r1 -- r2 ) r2 is the absolute value of r1. fnegate ( r1 -- r2 ) r2 is the negation of r1. f>s ( r -- n ) n is the single-cell signed-integer equivalent of the integer portion of r. s>f ( n -- r ) r is the floating-point equivalent of the single-cell value n. f>fx ( r -- d ) d is the fixed-point equivalent of the floating-point r fx>f ( d -- r ) r is the floating-point equivalent of the fixed-point d. f. ( r -- ) Display, with a trailing space, the top number using fixed-point notation: