This is probably a FAQ, and I don't really have a question about it, but I just ran across this in something I was working on:> as.integer(1000*1.003)[1] 1002 I didn't expect it, but maybe I should have. I guess it's about the machine precision added to the fact that as.integer always rounds down:> as.integer(1000*1.003 + 255 * .Machine$double.eps)[1] 1002> as.integer(1000*1.003 + 256 * .Machine$double.eps)[1] 1003 This does it right...> as.integer( round( 1000*1.003 ) )[1] 1003 ...but this seems to always give the same answer and it is a little faster in my application:> as.integer( 1000*1.003 + .1 )[1] 1003 FYI - I'm reading in a long vector of numbers from a text file with no more than three digits to the right of the decimal. I'm converting them to integers and saving them in binary format. Best, Mike
On Dec 31, 2014, at 3:24 PM, Mike Miller wrote:> This is probably a FAQ, and I don't really have a question about it, but I just ran across this in something I was working on: > >> as.integer(1000*1.003) > [1] 1002 > > I didn't expect it, but maybe I should have. I guess it's about the machine precision added to the fact that as.integer always rounds down: > > >> as.integer(1000*1.003 + 255 * .Machine$double.eps) > [1] 1002 > >> as.integer(1000*1.003 + 256 * .Machine$double.eps) > [1] 1003 > > > This does it right... > >> as.integer( round( 1000*1.003 ) ) > [1] 1003 > > ...but this seems to always give the same answer and it is a little faster in my application: > >> as.integer( 1000*1.003 + .1 ) > [1] 1003 > > > FYI - I'm reading in a long vector of numbers from a text file with no more than three digits to the right of the decimal. I'm converting them to integers and saving them in binary format. >So just add 0.0001 or even .0000001 to all of them and coerce to integer.> Best, > Mike > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.David Winsemius Alameda, CA, USA
How can I unsubscribe to not receive loop e mails? Sent from my Huawei Mobile David Winsemius <dwinsemius at comcast.net> wrote: On Dec 31, 2014, at 3:24 PM, Mike Miller wrote:> This is probably a FAQ, and I don't really have a question about it, but I just ran across this in something I was working on: > >> as.integer(1000*1.003) > [1] 1002 > > I didn't expect it, but maybe I should have. I guess it's about the machine precision added to the fact that as.integer always rounds down: > > >> as.integer(1000*1.003 + 255 * .Machine$double.eps) > [1] 1002 > >> as.integer(1000*1.003 + 256 * .Machine$double.eps) > [1] 1003 > > > This does it right... > >> as.integer( round( 1000*1.003 ) ) > [1] 1003 > > ...but this seems to always give the same answer and it is a little faster in my application: > >> as.integer( 1000*1.003 + .1 ) > [1] 1003 > > > FYI - I'm reading in a long vector of numbers from a text file with no more than three digits to the right of the decimal. I'm converting them to integers and saving them in binary format. >So just add 0.0001 or even .0000001 to all of them and coerce to integer.> Best, > Mike > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.David Winsemius Alameda, CA, USA ______________________________________________ R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see 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. ________________________________ This e-mail may contain information that is privileged or confidential. If you are not the intended recipient, please delete the e-mail and any attachments and notify us immediately.
On 31/12/2014 8:44 PM, David Winsemius wrote:> > On Dec 31, 2014, at 3:24 PM, Mike Miller wrote: > >> This is probably a FAQ, and I don't really have a question about it, but I just ran across this in something I was working on: >> >>> as.integer(1000*1.003) >> [1] 1002 >> >> I didn't expect it, but maybe I should have. I guess it's about the machine precision added to the fact that as.integer always rounds down: >> >> >>> as.integer(1000*1.003 + 255 * .Machine$double.eps) >> [1] 1002 >> >>> as.integer(1000*1.003 + 256 * .Machine$double.eps) >> [1] 1003 >> >> >> This does it right... >> >>> as.integer( round( 1000*1.003 ) ) >> [1] 1003 >> >> ...but this seems to always give the same answer and it is a little faster in my application: >> >>> as.integer( 1000*1.003 + .1 ) >> [1] 1003 >> >> >> FYI - I'm reading in a long vector of numbers from a text file with no more than three digits to the right of the decimal. I'm converting them to integers and saving them in binary format. >> > > So just add 0.0001 or even .0000001 to all of them and coerce to integer.I don't think the original problem was stated clearly, so I'm not sure whether this is a solution, but it looks wrong to me. If you want to round to the nearest integer, why not use round() (without the as.integer afterwards)? Or if you really do want an integer, why add 0.1 or 0.0001, why not add 0.5 before calling as.integer()? This is the classical way to implement round(). To state the problem clearly, I'd like to know what result is expected for any real number x. Since R's numeric type only approximates the real numbers we might not be able to get a perfect match, but at least we could quantify how close we get. Or is the input really character data? The original post mentioned reading numbers from a text file. Duncan Murdoch