home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / lang / c / 12970 < prev    next >
Encoding:
Internet Message Format  |  1992-08-30  |  2.2 KB

  1. Path: sparky!uunet!math.fu-berlin.de!news.netmbx.de!Germany.EU.net!mcsun!sun4nl!and!jos
  2. From: jos@and.nl (Jos Horsmeier)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: How is NaN recognized?
  5. Message-ID: <3358@dozo.and.nl>
  6. Date: 30 Aug 92 13:00:02 GMT
  7. References: <5569@ucsbcsl.ucsb.edu>
  8. Organization: AND Software BV Rotterdam
  9. Lines: 48
  10.  
  11. In article <5569@ucsbcsl.ucsb.edu> 6500mack@ucsbuxa.ucsb.edu (Michael P. Mack) writes:
  12. |I am using scanf() to read in a float that is entered by the user.  If
  13. |an invalid string is typed such as "-" or "." then the variable is
  14. |assigned -0.NaN(DFD5480000000000... or -0.NaN(DFD9400000000000000...
  15. |
  16. |How do I detect when the float is a NaN so that I can set it to 0.0?
  17.  
  18. Don't use scanf() for this, use a combination of fgets(), to read a line
  19. and atof() to convert the input string to a double value. atof() returns
  20. 0.0 if the string could not be converted to a double value and it
  21. sets (I'm not sure if all implementations do this) the errno variable
  22. to ERANGE in case of overflow.
  23.  
  24. If you realy want to play it on the safe side and control all the
  25. keystrokes from the user, you can implement a small DFA to scan the
  26. incoming characters. I think (I didn't test it) the following DFA
  27. could do the job for you:
  28.  
  29.             +   -  <d>  .   e
  30.               +---+---+---+---+---+
  31.             1 | 2 | 2 | 2 | 3 |   |
  32.               +---+---+---+---+---+
  33.             2 |   |   | 2 | 3 | 4 |
  34.               +---+---+---+---+---+
  35.             3 |   |   | 3 |   | 4 |
  36.               +---+---+---+---+---+
  37.             4 | 5 | 5 | 5 |   |   |
  38.               +---+---+---+---+---+
  39.             5 |   |   | 5 |   |   |
  40.               +---+---+---+---+---+
  41.  
  42.  
  43. Note: <d> is any digit. State 1 reads an optional +/- sign or the first 
  44.       digit or the decimal point. State 2 reads following digits, the
  45.       decimal point or the exponent sign. State 3 reads the optional
  46.       fraction part and state 4 and 5 read the exponent. All other
  47.       (blank) entries indicate an error if the current keystroke is
  48.       not a new line character, otherwise the input has been scanned
  49.       successfully.
  50.  
  51. It's not difficult to implement the DFA described above, either in
  52. tabular form or as one big switch statement.
  53.  
  54. I hope this helps a bit,
  55.  
  56. kind regards,
  57.  
  58. Jos aka jos@and.nl
  59.