# Rounding up in perl

Discussion in 'Perl Misc' started by David Groff, Dec 17, 2008.

1. ### David GroffGuest

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

David Groff, Dec 17, 2008

2. ### Jürgen ExnerGuest

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.

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

jue

Jürgen Exner, Dec 17, 2008

3. ### Peter J. HolzerGuest

On 2008-12-17 15:37, David Groff <> 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

Peter J. Holzer, Dec 17, 2008
4. ### Marshall DudleyGuest

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

Marshall Dudley, Dec 17, 2008
5. ### Jürgen ExnerGuest

Marshall Dudley <> wrote:
>David Groff wrote:
>> I tried the ceil() function but get an undefined subroutine
>> message.

>[...] convert to an integer then

jue

Jürgen Exner, Dec 17, 2008
6. ### Scott BryceGuest

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

Scott Bryce, Dec 17, 2008
7. ### Guest

On Wed, 17 Dec 2008 10:37:22 -0500, 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.

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

, Dec 18, 2008

<> 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/"

Tad J McClellan, Dec 19, 2008
9. ### Guest

On Thu, 18 Dec 2008 18:52:30 -0600, Tad J McClellan <> wrote:

> <> 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.

, Dec 19, 2008
10. ### Uri GuttmanGuest

>>>>> "s" == sln <> writes:

s> On Thu, 18 Dec 2008 18:52:30 -0600, Tad J McClellan <> 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 ------ -------- 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 ---------

Uri Guttman, Dec 19, 2008
11. ### Guest

On Thu, 18 Dec 2008 22:09:11 -0500, Uri Guttman <> wrote:

>>>>>> "s" == sln <> writes:

>
> s> On Thu, 18 Dec 2008 18:52:30 -0600, Tad J McClellan <> 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

It says it should not be used for rounding, for TWO reasons.
Thats two references to ROUNDING you say it doesen't use.

sln

, Dec 19, 2008
12. ### Tim GreerGuest

wrote:

>
> It says it should not be used for rounding, for TWO reasons.
> Thats two references to ROUNDING you say it doesen't use.
>
> sln

Or... it's that it could be used for rounding, but that it's not a good
idea, as you could have unexpected results. I'm sure there are other
functions to misuse just as easily, if you prefer.
--
Tim Greer, CEO/Founder/CTO, BurlyHost.com, Inc.
Shared Hosting, Reseller Hosting, Dedicated & Semi-Dedicated servers
and Custom Hosting. 24/7 support, 30 day guarantee, secure servers.
Industry's most experienced staff! -- Web Hosting With Muscle!

Tim Greer, Dec 19, 2008

<> wrote:
> On Thu, 18 Dec 2008 18:52:30 -0600, Tad J McClellan <> wrote:
>
>> <> 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,

int() does not do rounding.

> because it truncates towards 0,

int() does do truncating.

truncating is not rounding.

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

Tad J McClellan, Dec 19, 2008
14. ### Guest

On Thu, 18 Dec 2008 19:52:28 -0800, Tim Greer <> wrote:

> wrote:
>
>
>>
>> It says it should not be used for rounding, for TWO reasons.
>> Thats two references to ROUNDING you say it doesen't use.
>>
>> sln

>
>Or... it's that it could be used for rounding, but that it's not a good
>idea, as you could have unexpected results.

[snip]
And just what is that?

sln

, Dec 19, 2008
15. ### Guest

On Thu, 18 Dec 2008 22:13:57 -0600, Tad J McClellan <> wrote:

> <> wrote:
>> On Thu, 18 Dec 2008 18:52:30 -0600, Tad J McClellan <> wrote:
>>
>>> <> 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,

>
>
>int() does not do rounding.
>
>
>> because it truncates towards 0,

>
>
>int() does do truncating.
>
>truncating is not rounding.

You've confused posts here bud. Your clipping
what the docs? Not my words.

Does it truncate? What does it truncate?
How exactly do you truncate? Please tell us all.
While your at it, tell us what is rounding up and
down and how it relates to Perl.

Then tell us what Perl's int() is good for.

Thanks!

sln

, Dec 19, 2008
16. ### Guest

On Thu, 18 Dec 2008 21:02:34 -0800, Keith Keller <-francisco.ca.us> wrote:

>On 2008-12-18, <> wrote:
>>
>> 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.

>
>Good luck with that proof. The set of all numbers x such that
>2.0 <= x <= 2.9 is uncountable.
>
>Actually...why don't you stop posting till you complete the proof.
>
>--keith

As a proof, I'm only instred in what happens int the +-.1 range (-+)
of .5, not the whole universe of decimal places to the right.

sln

, Dec 19, 2008
17. ### Guest

On Fri, 19 Dec 2008 05:26:20 GMT, wrote:

>On Thu, 18 Dec 2008 21:02:34 -0800, Keith Keller <-francisco.ca.us> wrote:
>
>>On 2008-12-18, <> wrote:
>>>
>>> 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.

>>
>>Good luck with that proof. The set of all numbers x such that
>>2.0 <= x <= 2.9 is uncountable.
>>
>>Actually...why don't you stop posting till you complete the proof.
>>
>>--keith

>
>As a proof, I'm only instred in what happens int the +-.1 range (-+)
>of .5, not the whole universe of decimal places to the right.
>
>sln

Although, margins should be considered a factot in hyperbolic
design considerations, takr it with a grain of salt, add .000000000\
00000000000000000000000000000000000000000000000000000001 and see
how it plays out.

You just never know, you could discover the asteroid that perishes the
earth.

sln

, Dec 19, 2008
18. ### Tim GreerGuest

wrote:

> On Thu, 18 Dec 2008 19:52:28 -0800, Tim Greer <>
> wrote:
>
>> wrote:
>>
>>
>>>
>>> It says it should not be used for rounding, for TWO reasons.
>>> Thats two references to ROUNDING you say it doesen't use.
>>>
>>> sln

>>
>>Or... it's that it could be used for rounding, but that it's not a
>>good idea, as you could have unexpected results.

> [snip]
> And just what is that?
>
> sln

It might appear to be working fine and give you the desired/expected
results, but by the nature of it, and as you're warned about in the
docs you quoted yourself, it is not a good idea and probably won't work
how you expect it to. I don't know what else to say?
--
Tim Greer, CEO/Founder/CTO, BurlyHost.com, Inc.
Shared Hosting, Reseller Hosting, Dedicated & Semi-Dedicated servers
and Custom Hosting. 24/7 support, 30 day guarantee, secure servers.
Industry's most experienced staff! -- Web Hosting With Muscle!

Tim Greer, Dec 19, 2008
19. ### Guest

On Thu, 18 Dec 2008 22:42:35 -0800, Tim Greer <> wrote:

> wrote:
>
>> On Thu, 18 Dec 2008 19:52:28 -0800, Tim Greer <>
>> wrote:
>>
>>> wrote:
>>>
>>>
>>>>
>>>> It says it should not be used for rounding, for TWO reasons.
>>>> Thats two references to ROUNDING you say it doesen't use.
>>>>
>>>> sln
>>>
>>>Or... it's that it could be used for rounding, but that it's not a
>>>good idea, as you could have unexpected results.

>> [snip]
>> And just what is that?
>>
>> sln

>
>It might appear to be working fine and give you the desired/expected
>results, but by the nature of it, and as you're warned about in the
>docs you quoted yourself, it is not a good idea and probably won't work
>how you expect it to. I don't know what else to say?

It is certainty for you, you won't and can't depend on Perl intrinsic functions.
Because for you, they work intermittentely and with unexpected results.

I wish you luck.

sln

, Dec 19, 2008
20. ### Tim GreerGuest

wrote:

> On Thu, 18 Dec 2008 22:42:35 -0800, Tim Greer <>
> wrote:
>
>> wrote:
>>
>>> On Thu, 18 Dec 2008 19:52:28 -0800, Tim Greer <>
>>> wrote:
>>>
>>>> wrote:
>>>>
>>>>
>>>>>
>>>>> It says it should not be used for rounding, for TWO reasons.
>>>>> Thats two references to ROUNDING you say it doesen't use.
>>>>>
>>>>> sln
>>>>
>>>>Or... it's that it could be used for rounding, but that it's not a
>>>>good idea, as you could have unexpected results.
>>> [snip]
>>> And just what is that?
>>>
>>> sln

>>
>>It might appear to be working fine and give you the desired/expected
>>results, but by the nature of it, and as you're warned about in the
>>docs you quoted yourself, it is not a good idea and probably won't
>>work
>>how you expect it to. I don't know what else to say?

>
> It is certainty for you, you won't and can't depend on Perl intrinsic
> functions. Because for you, they work intermittentely and with
> unexpected results.
>
> I wish you luck.
>
> sln

I didn't create it, I didn't write the documentation about it. While
I'm sure one could work with said function to do rounding, it's not
intended to round and suffers from side effects. For the record, in
many, many years of coding in Perl, I've never had a single program
have unexpected results. This is probably attributed to the fact that
I use the correct, intended functions for what they were designed for,
assuming I don't roll out my own. Probably, ignoring the intent of a
function not being what you think it is, and the docs warning not to
use it for the purpose you want, is why you're so confused? Don't take
that out on me. Obviously, you _can_ use int() to round, but I doubt
it's going to work like you think. You *do* know what truncation is,
right?
--
Tim Greer, CEO/Founder/CTO, BurlyHost.com, Inc.
Shared Hosting, Reseller Hosting, Dedicated & Semi-Dedicated servers
and Custom Hosting. 24/7 support, 30 day guarantee, secure servers.
Industry's most experienced staff! -- Web Hosting With Muscle!

Tim Greer, Dec 19, 2008