Velocity Reviews > Perl > Rounding up in perl

# Rounding up in perl

David Groff
Guest
Posts: n/a

 12-17-2008

Is there more than one function for rounding a
number up in perl?
I tried the ceil() function but get an undefined subroutine
message.

Jürgen Exner
Guest
Posts: n/a

 12-17-2008
David Groff <(E-Mail Removed)> wrote:
>
>
>Is there more than one function for rounding a
>number up in perl?
>I tried the ceil() function but get an undefined subroutine
>message.

See
perldoc -q round
"Does Perl have a round() function? What about ceil() and floor()?"

jue

Peter J. Holzer
Guest
Posts: n/a

 12-17-2008
On 2008-12-17 15:37, David Groff <(E-Mail Removed)> wrote:
> Is there more than one function for rounding a
> number up in perl?

For rounding - yes. For rounding up - no.

> I tried the ceil() function but get an undefined subroutine
> message.

You forgot "use POSIX"?

hp

Marshall Dudley
Guest
Posts: n/a

 12-17-2008
David Groff wrote:
>
>
> Is there more than one function for rounding a
> number up in perl?
> I tried the ceil() function but get an undefined subroutine
> message.

Simply add 0.5 to the number and round, or convert to an integer then

Marshall

Jürgen Exner
Guest
Posts: n/a

 12-17-2008
Marshall Dudley <(E-Mail Removed)> wrote:
>David Groff wrote:
>> I tried the ceil() function but get an undefined subroutine
>> message.

>[...] convert to an integer then

jue

Scott Bryce
Guest
Posts: n/a

 12-17-2008
Marshall Dudley wrote:
> David Groff wrote:
>>
>>
>> Is there more than one function for rounding a
>> number up in perl?
>> I tried the ceil() function but get an undefined subroutine
>> message.

> Simply add 0.5 to the number and round, or convert to an integer then

Neither of these methods is bullet proof. Accuracy of the results will
depend on the number and/or the method used to do the rounding.

use strict;
use warnings;

while (my \$i = <DATA>)
{
chomp \$i;
my \$j = \$i + 1;
my \$k = \$i + 0.5;
print "\$i rounds to ", sprintf('%d', \$j), ' or ', sprintf('%.0f', \$k),
"\n";
}

__DATA__
2
3

----

2 rounds to 3 or 2
3 rounds to 4 or 4

sln@netherlands.com
Guest
Posts: n/a

 12-18-2008
On Wed, 17 Dec 2008 10:37:22 -0500, David Groff <(E-Mail Removed)> wrote:

>
>
>Is there more than one function for rounding a
>number up in perl?
>I tried the ceil() function but get an undefined subroutine
>message.

Here is a Perl ceil/floor equivalent. The first code section
seems to correctly implement floor by taking into account that
int() does not use the sign in its process of rounding. The
second code section with floor, although intuitive is not correct.
For a full proof, all the values between 2.0 - 2.9 should be checked.

sln

# ===========================================
# Correct ceil/floor equavelent
# when rounding.
# - - - - - - - -
use strict;
use warnings;

printf( "The floor of 2.8 is %f\n", _floor( 2.8 ) );
printf( "The floor of -2.8 is %f\n", _floor( -2.8 ) );

printf( "The ceil of 2.8 is %f\n", _ceil( 2.8 ) );
printf( "The ceil of -2.8 is %f\n", _ceil( -2.8 ) );

sub _ceil {return int(shift()+.5)}

sub _floor {my \$y = shift(); return int((\$y < 0) ? \$y-.5 : \$y)}

__END__

The floor of 2.8 is 2.000000
The floor of -2.8 is -3.000000
The ceil of 2.8 is 3.000000
The ceil of -2.8 is -2.000000

# ===========================================
# Correct ceil equavelent, incorrect floor
# Int() rounds down the Absolute value.
# So do not use this floor.
# - - - - - - - -
use strict;
use warnings;

printf( "The floor of 2.8 is %f\n", _floor( 2.8 ) );
printf( "The floor of -2.8 is %f\n", _floor( -2.8 ) );

printf( "The ceil of 2.8 is %f\n", _ceil( 2.8 ) );
printf( "The ceil of -2.8 is %f\n", _ceil( -2.8 ) );

sub _ceil {return int(shift()+.5)}

sub _floor {return int(shift())}

__END__

The floor of 2.8 is 2.000000
The floor of -2.8 is -2.000000
The ceil of 2.8 is 3.000000
The ceil of -2.8 is -2.000000

==========================================
C - reference code

// crt_floor.c
// This example displays the largest integers
// less than or equal to the floating-point values 2.8
// and -2.8. It then shows the smallest integers greater
// than or equal to 2.8 and -2.8.

#include <math.h>
#include <stdio.h>

int main( void )
{
double y;

y = floor( 2.8 );
printf( "The floor of 2.8 is %f\n", y );
y = floor( -2.8 );
printf( "The floor of -2.8 is %f\n", y );

y = ceil( 2.8 );
printf( "The ceil of 2.8 is %f\n", y );
y = ceil( -2.8 );
printf( "The ceil of -2.8 is %f\n", y );
}

Output

The floor of 2.8 is 2.000000
The floor of -2.8 is -3.000000
The ceil of 2.8 is 3.000000
The ceil of -2.8 is -2.000000

Guest
Posts: n/a

 12-19-2008
http://www.velocityreviews.com/forums/(E-Mail Removed) <(E-Mail Removed)> wrote:

> taking into account that
> int() does not use the sign in its process of rounding.

That is because int() does not *have* a process of rounding.

int() does not do rounding.

--
email: perl -le "print scalar reverse qq/moc.noitatibaher\100cmdat/"

sln@netherlands.com
Guest
Posts: n/a

 12-19-2008
On Thu, 18 Dec 2008 18:52:30 -0600, Tad J McClellan <(E-Mail Removed)> wrote:

>(E-Mail Removed) <(E-Mail Removed)> wrote:
>
>> taking into account that
>> int() does not use the sign in its process of rounding.

>
>
>That is because int() does not *have* a process of rounding.
>
>int() does not do rounding.

Not only does int() round, but there is no way it can return
without rounding.

sln

perlfunc.html
===============================
Numeric functions

...., int, ...

int EXPR

int

Returns the integer portion of EXPR. If EXPR is omitted,
uses \$_. You should not use this function for rounding:
one because it truncates towards 0, and two because machine
representations of floating point numbers can sometimes
produce counterintuitive results.

Uri Guttman
Guest
Posts: n/a

 12-19-2008
>>>>> "s" == sln <(E-Mail Removed)> writes:

s> On Thu, 18 Dec 2008 18:52:30 -0600, Tad J McClellan <(E-Mail Removed)> wrote:

>> That is because int() does not *have* a process of rounding.
>> int() does not do rounding.

s> Not only does int() round, but there is no way it can return
s> without rounding.

and you determined that from what text in the docs you quote?

s> perlfunc.html
s> ===============================
s> Numeric functions

s> ..., int, ...

s> int EXPR

s> int

s> Returns the integer portion of EXPR. If EXPR is omitted,
s> uses \$_. You should not use this function for rounding:
s> one because it truncates towards 0, and two because machine
s> representations of floating point numbers can sometimes
s> produce counterintuitive results.

and where does it say int() does rounding? it even says you should NOT
use it for rounding. truncation (which is what int() does) is not
rounding in any sense of the term rounding. your saying otherwise will
not make it so.

uri

--
Uri Guttman ------ (E-Mail Removed) -------- http://www.sysarch.com --
----- Perl Code Review , Architecture, Development, Training, Support ------
--------- Free Perl Training --- http://perlhunter.com/college.html ---------
--------- Gourmet Hot Cocoa Mix ---- http://bestfriendscocoa.com ---------