[R] strangely long floating point with write.table()

Rui Barradas ruipbarradas at sapo.pt
Sat Mar 15 21:40:58 CET 2014


Hello,

I haven't followed this thread since its start but I think you now have 
a case for FAQ 7.31. See inline below.

Em 15-03-2014 19:54, Mike Miller escreveu:
> On Sat, 15 Mar 2014, peter dalgaard wrote:
>
>> I don't think so. I think some of your numbers differ sufficiently
>> from numbers with only a few digits to the right of the decimal that
>> write.table needs to write them with increased precision. You didn't
>> read them like that, didn't you? You did some calculations, and then
>> it _looked like_ the results have <= 6 digits after the decimal point?
>
> These have different representations:
>
> 1-0.995
> 2-1.995
>
> write(c(1-0.995, 2-1.995), file="data1.txt", sep="\n")
> write.table(c(1-0.995, 2-1.995), file="data2.txt", row.names=F,
> col.names=F)
>
> $ head -2 data[12].txt
> ==> data1.txt <==
> 0.005
> 0.005
>
> ==> data2.txt <==
> 0.005
> 0.00499999999999989
>
>
>> The digits= setting has nothing to do with this, write.table alway
>> does its damndest to avoid loss of precision. This _is_ in
>> help(write.table):
>>
>>     In almost all cases the conversion of numeric quantities is
>>     governed by the option ‘"scipen"’ (see ‘options’), but with the
>>     internal equivalent of ‘digits = 15’.  For finer control, use
>>     ‘format’ to make a character matrix/data frame, and call
>>     ‘write.table’ on that.
>
> Yes!  This was my mistake:  write() not write.table() is controlled by
> options(digits=7).  Repeating the write() command using a different
> number of digits:
>
>> options(digits=15)
>> getOption("digits")
> [1] 15
>> write(c(1-0.995, 2-1.995), file="data1.txt", sep="\n")
>
> $ cat data1.txt
> 0.005
> 0.00499999999999989
>
> I don't know why it shows 17 digits and doesn't round to 15, but it is
> showing that the numbers are different, for some reason.
>
> Do you understand why there is a difference between 1-0.995 and 2-1.995
> in their internal representations?

Try

 > (1-0.995) - 0.005
[1] 4.336809e-18
 > (2-1.995) - 0.005
[1] -1.066855e-16


Hope this helps,

Rui Barradas

>
> Mike
>
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>




More information about the R-help mailing list