Guest User

Test string for floating-point number (Forth)

a guest
Aug 10th, 2024
65
0
14 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.09 KB | Source Code | 0 0
  1. \ Test string for floating-point number (Forth)
  2.  
  3. \ kernel functions
  4. \ /char ( a u -- a+1 u-1 c )
  5. \ /sign ( a u -- a' u' f ) \ handles +/-
  6. \ /number ( a u -- a' u' d|ud ) \ handles +/-
  7. \ >digit ( c base -- u -1 | c 0 )
  8.  
  9. variable dpf \ decimal point
  10.  
  11. : /digs ( adr len -- adr' len' )
  12. begin dup while
  13. /char #10 >digit while
  14. drop
  15. repeat drop -1 /string then ;
  16.  
  17. : /mant ( adr len -- adr' len' flag )
  18. tuck /digs dup if
  19. over c@ [char] . = if
  20. dpf on 1 /string /digs
  21. then
  22. then rot over - dpf @ + ;
  23.  
  24. : /exp ( adr len -- adr' len' )
  25. dup if
  26. over c@ 33 or [char] e = ( 'D' 'E' 'd' 'e')
  27. negate /string
  28. then
  29. /number 2drop ;
  30.  
  31. \ Test string for float; stop at unconvertible char
  32. : /FLOAT ( adr len -- adr' len' )
  33. dpf off /sign drop /mant if /exp then ;
  34.  
  35. \ Test string for float; return true/false
  36. : FLOAT? ( c-addr u -- f )
  37. -trailing /float nip 0= ;
  38.  
  39. s" 123" float? cr .
  40. s" +123" float? cr .
  41. s" -123" float? cr .
  42. s" 123." float? cr .
  43. s" 123e+4" float? cr .
  44. s" 123D" float? cr .
  45. s" 123.." float? cr . ( fails)
  46.  
Advertisement
Add Comment
Please, Sign In to add comment