From: baum <[email protected]>
Kompal Sinha <[email protected]> wrote,
> Hi there, I have converted a 15 digit string into a numerical number by
> using real() command. My problem is that now the data is read as floats
> while I want it to be in doubles as the string happens to be the caseId of
> my data. How do I proceed??
and Kit Baum <[email protected]> replied,
Very bad idea. There is no way of representing this many digits reliably as
a floating point number, even using double precision; [...]
^^^^^^^^^^^^^^^^^^^^^^^^^^^
(emphasis added).
Kit is right about the "very bad idea" with respect to -float-, but not with
respect to -double-. The problem arises at 16 digits, not 15. Below I
demonstrate that 15 digits work:
. input double x
x
1. 999999999999990
2. 999999999999991
3. 999999999999992
4. 999999999999993
5. 999999999999994
6. 999999999999995
7. 999999999999996
8. 999999999999997
9. 999999999999998
10. 999999999999999
11. end
. format x %20.0g
. list
x
1. 999999999999990
2. 999999999999991
3. 999999999999992
4. 999999999999993
5. 999999999999994
6. 999999999999995
7. 999999999999996
8. 999999999999997
9. 999999999999998
10. 999999999999999
----+----1----+
The above numbers have 15 digits. Here is what happens if we repeat the
experiment with 16 digits:
. input double x
x
1. 9999999999999990
2. 9999999999999991
3. 9999999999999992
4. 9999999999999993
5. 9999999999999994
6. 9999999999999995
7. 9999999999999996
8. 9999999999999997
9. 9999999999999998
10. 9999999999999999
11. end
. format x %20.0g
. list
x
1. 9999999999999990
2. 9999999999999992
3. 9999999999999992
4. 9999999999999992
5. 9999999999999994
6. 9999999999999996
7. 9999999999999996
8. 9999999999999996
9. 9999999999999998
10. 10000000000000000
Double-precision numbers use 51+1 = 52 bits for the significand (+1 because
one bit is "implied"). Thus, the largest integer that can be stored is all 52
bits on, which is (2^53)-1 = (9.007e+15)-1. The largest 15 digit integer is
999999999999999 = 9.99999999999999e+14, and that is below the limit.
My advice to Kompal is to count your digits carefully be be sure that you
have 15 and not 16, and then to use -double-.
-- Bill
[email protected]
P.S. I bet I know why Kit made the error because I almost made it myself.
A 15-digit number, I said to myself, that's like 9.999...e+15, yes?
No, a 15-digit number is 9.999...e+14.
<end>
*
* 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/