I just looked at the round function in xround.c, and it does not look to complicated to modify round() to obtain have three more functions, aligned to the R functions:
From the R help: ,---- | ‘ceiling’ takes a single numeric argument ‘x’ and returns a | numeric vector containing the smallest integers not less than the | corresponding elements of ‘x’. | | ‘floor’ takes a single numeric argument ‘x’ and returns a numeric | vector containing the largest integers not greater than the | corresponding elements of ‘x’. | | ‘trunc’ takes a single numeric argument ‘x’ and returns a numeric | vector containing the integers formed by truncating the values in | ‘x’ toward ‘0’. `---- In addition, an additional argument could be added to the round() function to round to the number of specified decimal places, so that it is equivalent to your suggestion, Paulo. From the R help: ,---- | ‘round’ rounds the values in its first argument to the specified | number of decimal places (default 0). `---- Unfortunately I don't have the experience in C and absolutely no time at the moment to get into it. Cheers, Rainer Paulo van Breugel <p.vanbreu...@gmail.com> writes: > I would second that, it certainly would be handy to be able to round > numbers outside the integer range and in addition, rounding with a specific > number of decimal places, like e.g., the function round() in R. Is there a > specific reason the round() function results in an integer? > > Paulo > > > On Wed, May 15, 2013 at 9:20 PM, Rainer M Krug <r.m.k...@gmail.com> wrote: > >> >> >> On Wednesday, May 15, 2013, Glynn Clements wrote: >> >>> >>> Paulo van Breugel wrote: >>> >>> > I am having trouble with the following computation, which gives me an >>> > overflow warning ("WARNING: Overflow occured in the calculation"). >>> > >>> > r.mapcalc "A = if(B==0, >>> (round(C/0.0001)-1175699902)/(3007966667-1175699902) *100.0, 1)" --overwrite >>> > >>> > >>> > whereby C is a map with values between 1 and 31000. It seems to be >>> > related to the size of the numbers (no warning if I divide C by 0.001), >>> > but I am not clear what limit I am hitting here or how to avoid this. >>> > >>> > The warning does not stop the calculation, and the resulting map seems >>> > to be correct. However, I rather avoid this warning, also because the >>> > warning message causes problems when running in batch from within R. >>> >>> The round() function always returns an integer, regardless of its >>> argument types. Integers are always 32-bit, so the result is limited >>> to the range +/- 2147483647 (2^31-1). >> >> >> True - but is there an equivalent function to round numbers outside the >> integer range? Would be useful. Looking at the functions in r.mapcalc, I >> can't think of a way of doing this? >> >> Rainer >> >> >>> >>> -- >>> Glynn Clements <gl...@gclements.plus.com> >>> _______________________________________________ >>> grass-dev mailing list >>> grass-dev@lists.osgeo.org >>> http://lists.osgeo.org/mailman/listinfo/grass-dev >>> >> >> >> -- >> Rainer M. Krug, PhD (Conservation Ecology, SUN), MSc (Conservation >> Biology, UCT), Dipl. Phys. (Germany) >> >> Centre of Excellence for Invasion Biology >> Stellenbosch University >> South Africa >> >> Tel : +33 - (0)9 53 10 27 44 >> Cell: +33 - (0)6 85 62 59 98 >> Fax (F): +33 - (0)9 58 10 27 44 >> >> Fax (D): +49 - (0)3 21 21 25 22 44 >> >> email: rai...@krugs.de >> >> Skype: RMkrug >> >> -- Rainer M. Krug, PhD (Conservation Ecology, SUN), MSc (Conservation Biology, UCT), Dipl. Phys. (Germany) Centre of Excellence for Invasion Biology Stellenbosch University South Africa Tel : +33 - (0)9 53 10 27 44 Cell: +33 - (0)6 85 62 59 98 Fax : +33 - (0)9 58 10 27 44 Fax (D): +49 - (0)3 21 21 25 22 44 email: rai...@krugs.de Skype: RMkrug
pgp18ufkCqXo2.pgp
Description: PGP signature
_______________________________________________ grass-dev mailing list grass-dev@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/grass-dev