Rounding up in perl

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

  1. David Groff

    David Groff Guest

    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
    #1
    1. Advertising

  2. 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
    #2
    1. Advertising

  3. 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
    #3
  4. 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
    add 1 or add 1 then convert to an integer.

    Marshall
     
    Marshall Dudley, Dec 17, 2008
    #4
  5. Marshall Dudley <> wrote:
    >David Groff wrote:
    >> I tried the ceil() function but get an undefined subroutine
    >> message.

    >[...] convert to an integer then
    >add 1 or add 1 then convert to an integer.


    Bad idea if the number is a natural number already.

    jue
     
    Jürgen Exner, Dec 17, 2008
    #5
  6. David Groff

    Scott Bryce Guest

    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
    > add 1 or add 1 then convert to an integer.



    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
    #6
  7. David Groff

    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
    # This floor takes the sign into acount
    # 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
    #7
  8. <> 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.


    --
    Tad McClellan
    email: perl -le "print scalar reverse qq/moc.noitatibaher\100cmdat/"
     
    Tad J McClellan, Dec 19, 2008
    #8
  9. David Groff

    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
    #9
  10. David Groff

    Uri Guttman Guest

    >>>>> "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
    #10
  11. David Groff

    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
    #11
  12. David Groff

    Tim Greer Guest

    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
    #12
  13. <> 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.


    --
    Tad McClellan
    email: perl -le "print scalar reverse qq/moc.noitatibaher\100cmdat/"
     
    Tad J McClellan, Dec 19, 2008
    #13
  14. David Groff

    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
    #14
  15. David Groff

    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
    #15
  16. David Groff

    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
    #16
  17. David Groff

    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
    #17
  18. David Groff

    Tim Greer Guest

    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
    #18
  19. David Groff

    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
    #19
  20. David Groff

    Tim Greer Guest

    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
    #20
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. walala
    Replies:
    12
    Views:
    1,947
  2. valentin tihomirov

    rounding to integer

    valentin tihomirov, Feb 15, 2004, in forum: VHDL
    Replies:
    2
    Views:
    10,011
    Jonathan Bromley
    Feb 16, 2004
  3. C

    Rounding Numbers

    C, Aug 25, 2003, in forum: ASP .Net
    Replies:
    2
    Views:
    513
  4. jon rogers

    Rounding a float in Perl?

    jon rogers, Oct 27, 2003, in forum: Perl Misc
    Replies:
    18
    Views:
    703
    Anno Siegel
    Nov 5, 2003
  5. Replies:
    5
    Views:
    137
    Ilya Zakharevich
    Jan 24, 2008
Loading...

Share This Page