Hello, Suppose I have x, which is a variable of class numeric. The calculations performed to yield x imply that mathematically it should be an integer , but due to round-off errors, it might not be (and so in either direction). The error is however small, so round(x) will yield the appropriate integer value. Moreover, this integer values is guaranteed to be representable by an 'integer' class, that is -2^31 < x < 2^31, and logically it is an integer anyway. So I want to convert x from class 'numeric' to 'integer'. What is the most elegant, but always correct way, to achieve this conversion ? What comes to mind is of course something along: x = as.integer(round(x)) I am, however, not sure if this always works, because I do not know if the round-function is guaranteed to return a numeric value which, in finite binary representation, is always >= the underlying mathematical integer. If that is however guaranteed, that would of course be a simple + elegant one. An alternative I came up with is: x = as.integer(round(x) + ifelse(x >= 0, 0.5, -0.5)) Where I explicitly add a bit to ensure the finite binary representation must be >= the underlying integer, and then truncate the decimal digits. IMO, this one is always guaranteed to work, at least within the numerical range of what integers are limited to anyway. What's your opinion on the issue ? Any other solution ? Thanks a lot in advance and cheers, Thomas
How about ceiling(x), which return the smallest integer not less than x? On Sun, May 17, 2009 at 2:49 AM, Thomas Mang <thomas.mang at fiwi.at> wrote:> Hello, > > Suppose I have x, which is a variable of class numeric. The calculations > performed to yield x imply that mathematically it should be an integer , but > due to round-off errors, it might not be (and so in either direction). The > error is however small, so round(x) will yield the appropriate integer > value. Moreover, this integer values is guaranteed to be representable by an > 'integer' class, that is -2^31 < x < 2^31, and logically it is an integer > anyway. So I want to convert x from class 'numeric' to 'integer'. What is > the most elegant, but always correct way, to achieve this conversion ? > > What comes to mind is of course something along: > > x = as.integer(round(x)) > > I am, however, not sure if this always works, because I do not know if the > round-function is guaranteed to return a numeric value which, in finite > binary representation, is always >= the underlying mathematical integer. If > that is however guaranteed, that would of course be a simple + elegant one. > > An alternative I came up with is: > > x = as.integer(round(x) + ifelse(x >= 0, 0.5, -0.5)) > Where I explicitly add a bit to ensure the finite binary representation must > be >= the underlying integer, and then truncate the decimal digits. > IMO, this one is always guaranteed to work, at least within the numerical > range of what integers are limited to anyway. > > > What's your opinion on the issue ? > Any other solution ? > > Thanks a lot in advance and cheers, > Thomas > > ______________________________________________ > 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. >
On Sun, May 17, 2009 at 5:00 PM, Thomas Mang <Thomas.Mang at fiwi.at> wrote:> Hi, > > Well, also not quite. > Suppose x = 5.00000000001 (in finite binary represenation). Then I want x => 5, but that is of course an integer which is now less than the original > numeral.Sorry for that I haven't got what your mean exactly about the finite binary representation, because my English is not very good. How much is the difference of x and 5 when result must be 5?> Your code would turn it into 6; ?moreover, your code would still work on > numeric-values, so once it gets to the interger-conversion we are back at > where the problem started, namely at the issue of finite floating-point > representations, which might, or might not, yield the desired integer after > the decimal digits have been truncated. > > BTW, do you know why sometimes replys do not appear in the newsgroups -> > mine to yours is not there, equally not your last response (althought the > later might of course be the resuld because I made a mistak. in the first > step....)The reason our last replys did not appear in the newsgroup is that you replied to me only rather than to the maillist addres r-help at stat.math.ethz.ch.> > cheers and thanks, > Thomas > > > Linlin Yan wrote: >> >> I see. What you want is the integer with same sign as the original >> numeral, and whose absolute value is the least integer which is not >> less than absolute value of the original numeral. Am I right? I am >> afraid that there may not be any single function could work it out. >> But I could give the following expression: >> sign(x) * ceiling(abs(x)), >> which may be a little clearer. >> >> On Sun, May 17, 2009 at 2:02 PM, Thomas Mang <Thomas.Mang at fiwi.at> wrote: >> >>> >>> Hi, >>> >>> ceiling would do the wrong thing for negative values. If x = -4.9999999, >>> the >>> wanted result would be -5, but ceiling makes a -4 out of it. >>> >>> bye, >>> Thomas >>> >>> Linlin Yan wrote: >>> >>>> >>>> How about ceiling(x), which return the smallest integer not less than x? >>>> >>>> On Sun, May 17, 2009 at 2:49 AM, Thomas Mang <thomas.mang at fiwi.at> >>>> wrote: >>>> >>>> >>>>> >>>>> Hello, >>>>> >>>>> Suppose I have x, which is a variable of class numeric. The >>>>> calculations >>>>> performed to yield x imply that mathematically it should be an integer >>>>> , >>>>> but >>>>> due to round-off errors, it might not be (and so in either direction). >>>>> The >>>>> error is however small, so round(x) will yield the appropriate integer >>>>> value. Moreover, this integer values is guaranteed to be representable >>>>> by >>>>> an >>>>> 'integer' class, that is -2^31 < x < 2^31, and logically it is an >>>>> integer >>>>> anyway. So I want to convert x from class 'numeric' to 'integer'. What >>>>> is >>>>> the most elegant, but always correct way, to achieve this conversion ? >>>>> >>>>> What comes to mind is of course something along: >>>>> >>>>> x = as.integer(round(x)) >>>>> >>>>> I am, however, not sure if this always works, because I do not know if >>>>> the >>>>> round-function is guaranteed to return a numeric value which, in finite >>>>> binary representation, is always >= the underlying mathematical >>>>> integer. >>>>> If >>>>> that is however guaranteed, that would of course be a simple + elegant >>>>> one. >>>>> >>>>> An alternative I came up with is: >>>>> >>>>> x = as.integer(round(x) + ifelse(x >= 0, 0.5, -0.5)) >>>>> Where I explicitly add a bit to ensure the finite binary representation >>>>> must >>>>> be >= the underlying integer, and then truncate the decimal digits. >>>>> IMO, this one is always guaranteed to work, at least within the >>>>> numerical >>>>> range of what integers are limited to anyway. >>>>> >>>>> >>>>> What's your opinion on the issue ? >>>>> Any other solution ? >>>>> >>>>> Thanks a lot in advance and cheers, >>>>> Thomas >>>>> >>>>> ______________________________________________ >>>>> 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. >>>>> >>>>> >>>>> >>>> >>>> >>> >>> >> >> > >
Try: as.integer(x + 0.5) assuming the calculation error is less than 0.5 . On Sat, May 16, 2009 at 2:49 PM, Thomas Mang <thomas.mang at fiwi.at> wrote:> Hello, > > Suppose I have x, which is a variable of class numeric. The calculations > performed to yield x imply that mathematically it should be an integer , but > due to round-off errors, it might not be (and so in either direction). The > error is however small, so round(x) will yield the appropriate integer > value. Moreover, this integer values is guaranteed to be representable by an > 'integer' class, that is -2^31 < x < 2^31, and logically it is an integer > anyway. So I want to convert x from class 'numeric' to 'integer'. What is > the most elegant, but always correct way, to achieve this conversion ? > > What comes to mind is of course something along: > > x = as.integer(round(x)) > > I am, however, not sure if this always works, because I do not know if the > round-function is guaranteed to return a numeric value which, in finite > binary representation, is always >= the underlying mathematical integer. If > that is however guaranteed, that would of course be a simple + elegant one. > > An alternative I came up with is: > > x = as.integer(round(x) + ifelse(x >= 0, 0.5, -0.5)) > Where I explicitly add a bit to ensure the finite binary representation must > be >= the underlying integer, and then truncate the decimal digits. > IMO, this one is always guaranteed to work, at least within the numerical > range of what integers are limited to anyway. > > > What's your opinion on the issue ? > Any other solution ? > > Thanks a lot in advance and cheers, > Thomas > > ______________________________________________ > 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. >