home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / lang / tcl / 1020 < prev    next >
Encoding:
Internet Message Format  |  1992-07-22  |  3.0 KB

  1. Path: sparky!uunet!zaphod.mps.ohio-state.edu!magnus.acs.ohio-state.edu!usenet.ins.cwru.edu!agate!agate!adrianho
  2. From: adrianho@barkley.berkeley.edu (Adrian J Ho)
  3. Newsgroups: comp.lang.tcl
  4. Subject: Re: bug in expr?
  5. Date: 22 Jul 92 04:09:54
  6. Organization: University of California, Berkeley
  7. Lines: 59
  8. Message-ID: <ADRIANHO.92Jul22040954@barkley.berkeley.edu>
  9. References: <1992Jul21.215415.23716@crd.ge.com>
  10. NNTP-Posting-Host: barkley.berkeley.edu
  11. In-reply-to: kennykb@dssv01.crd.ge.com's message of 21 Jul 92 21:54:15 GMT
  12.  
  13. In article <1992Jul21.215415.23716@crd.ge.com> kennykb@dssv01.crd.ge.com (Kevin B. Kenny) writes:
  14. >Can someone explain the following?  More to the point, can someone fix it?
  15. >wish: set x [expr 400000.0+500000.0]
  16. >900000
  17. >wish: set y [expr $x*$x]
  18. >-1748818944
  19. >The square of 900000.0 oughtn't to be a large negative number.
  20.  
  21. EXPLANATION: In the Expressions subsection of the Tcl(3) man page:
  22.  
  23.     [...] Where possible, operands are interpreted as integer
  24. values. [...] If an operand does not have one of the integer formats
  25. given above, then it is treated as a floating point number if that is
  26. possible. [...] If no numeric interpretation is possible, then an
  27. operand is left as a string (and only a limited set of operators may
  28. be applied to it.
  29.  
  30. The first expression sets x to 900000 (not 900000.0), which is
  31. subsequently treated as an *integer* in the second expression.  This
  32. is because the conversion of a floating-point number back to a string
  33. is done as follows:
  34.  
  35. sprintf(valuePtr->pv.buffer, "%g", valuePtr->doubleValue);
  36.                               ^^
  37. This strips all trailing zeros, and the decimal point if the previous
  38. operation leaves nothing behind it.
  39.  
  40. FIX: (1) set y [expr $x.0*$x.0] (kludge)
  41.      (2) Change %g above to %e or %f.  Disadvantage: Some numbers will
  42.          look ugly (eg. 900000.0 is returned as 900000.000000).  Apply
  43.          the following patch (change %e to %f if that's your liking):
  44.  
  45. *** tclExpr.c~  Mon Mar 23 09:54:06 1992
  46. --- tclExpr.c   Wed Jul 22 04:03:17 1992
  47. ***************
  48. *** 1124,1130 ****
  49.       if (valuePtr->type == TYPE_INT) {
  50.         sprintf(valuePtr->pv.buffer, "%ld", valuePtr->intValue);
  51.       } else if (valuePtr->type == TYPE_DOUBLE) {
  52. !       sprintf(valuePtr->pv.buffer, "%g", valuePtr->doubleValue);
  53.       }
  54.       valuePtr->type = TYPE_STRING;
  55.   }
  56. --- 1124,1130 ----
  57.       if (valuePtr->type == TYPE_INT) {
  58.         sprintf(valuePtr->pv.buffer, "%ld", valuePtr->intValue);
  59.       } else if (valuePtr->type == TYPE_DOUBLE) {
  60. !       sprintf(valuePtr->pv.buffer, "%e", valuePtr->doubleValue);
  61.       }
  62.       valuePtr->type = TYPE_STRING;
  63.   }
  64.  
  65. Any comments, John?
  66. --
  67. -----------------------------------------------------------------------------
  68. Adrian Ho, He With The Embarrassingly *Dead* Passion ** Phone: (510) 642-5563
  69. System Manager, CFD Lab, ME Dept, UC Berkeley * adrianho@barkley.berkeley.edu
  70. Maintainer, Tcl/Tk Contrib Archive ---- barkley.berkeley.edu [128.32.142.237]
  71.   Send all Tcl/Tk Archive-related stuff to tcl-archive@barkley.berkeley.edu
  72.