Guillaume Frechette had posted on a problem related to numerical precision in
expressions with arguments of certain noninteger numbers. I posted an admittedly
awkward approach using tolerances. Nick Cox posted an alternative, exploiting Stata's
consistency in internally representing precision to define categories using -egen,
group()- that contain like noninteger numbers. Guillaume followed up with what seems
like a more elegant solution:
----------------------------begin excerpted posting-----------------------------------------------
Nick proposed one solution, here's another one which I just found:
. tab baz if baz==1-float(1/3)-float(1/3)
baz | Freq. Percent Cum.
------------+----------------------------------
.3333333 | 1257 100.00 100.00
------------+----------------------------------
Total | 1257 100.00
---------------------------end excerpted posting--------------------------------------------------
Guillaume's solution works for single-precision (see
www.stata.com/support/faqs/data/float.html), but an attempt to use it with double-
precision variables doesn't work. Omitting the -float()- function, however, does seems
to work with double-precision variables, in a manner exactly the opposite of that with
single-precsion variables (see log file below). Stata's representation of precision
doesn't seem consistent here for some reason.
Joseph Coveney
--------------------------------------begin log--------------------------------------------------------
. set obs 850
obs was 0, now 850
. generate double foo=1.0/3.0
. generate double bar=1.0/3.0
. generate double baz=1.0-foo-bar
. * next line from Guillaume Frechette's posting
. tab baz if baz==1-float(1/3)-float(1/3)
no observations
. tabulate baz if baz==1-1/3-1/3
baz | Freq. Percent Cum.
------------+-----------------------------------
.3333333 | 850 100.00 100.00
------------+-----------------------------------
Total | 850 100.00
. clear
. set obs 850
obs was 0, now 850
. generate float foo=1.0/3.0
. generate float bar=1.0/3.0
. generate float baz=1.0-foo-bar
. tab baz if baz==1-float(1/3)-float(1/3)
baz | Freq. Percent Cum.
------------+-----------------------------------
.3333333 | 850 100.00 100.00
------------+-----------------------------------
Total | 850 100.00
. tabulate baz if baz==1-1/3-1/3
no observations
--------------------------------------begin log--------------------------------------------------------
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/