Float.round - should it be round-to-even

Discussion in 'Ruby' started by OliverMarchand, Apr 12, 2006.

  1. I am suggesting to change the Float.round function to use the
    well-known round-to-even method in case of a tie, i.e. x.5, where the
    distance to ceil and floor is equal.

    round currently uses a round-away-from-zero strategy. This strategy
    will introduce a bias when applied to many numbers, i.e. the average of
    the rounded numbers will be higher than that of original numbers. This
    effect does make a considerable difference, despite the singular nature
    of the x.5 values. Consider e.g. the computation of the median of an
    array with floats.

    Here is a quick hack ruby implementation which adds round to even to
    the Float class:

    class Float

    def signum
    if self>=0.0; 1.0
    else; -1.0
    end
    end

    def roundte
    s = self.signum
    f = self*s

    rp = f-f.floor
    rm = f.ceil-f
    if rp>rm
    return (s*f.ceil).to_i
    elsif rp<rm
    return (s*f.floor).to_i
    else
    if (f.ceil%2)==0; return (s*f.ceil).to_i
    else; return (s*f.floor).to_i
    end
    end
    end

    end

    Round is implemented in float.c. Anyone interested in me implementing
    round-to-even there?

    tschuess,
    Oliver
    OliverMarchand, Apr 12, 2006
    #1
    1. Advertising

  2. > Consider e.g. the computation of the median of an array with floats.

    If your input data are floats and your result is also a float, may ask
    you why you want to round them?

    If you are actually thinking of rounding errors, i.e., the fact that
    (1/2.0) + (1/3.0) != 5/6.0, well, they are independent of Float#round.

    By the way, the median [1] is hardly biased by rounding errors. It's
    the mean that is sensitive to that.

    Ciao,
    Stefano

    [1] http://mathworld.wolfram.com/StatisticalMedian.html
    Stefano Taschini, Apr 12, 2006
    #2
    1. Advertising

  3. Stefano, thanks for your input!

    > If your input data are floats and your result is also a float, may ask
    > you why you want to round them?


    I used a (as I saw now) non-standard definition of the median, in ruby
    say:

    median =
    array_with_floats.sort[(array_with_floats.length/2).to_f.round]

    where the median is ensured to be an element of the list of values.

    With the standard definition from [1], there is no rounding effect -
    yes.

    I have no formal analysis of this at hand or cannot quickly derive one,
    but I am pretty sure that using round-to-even for my median is
    statistically "better" in a useful sense then using
    round-away-from-zero.

    cheers,
    Oliver
    OliverMarchand, Apr 12, 2006
    #3
    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. Stan Goodman

    Even older fart, even newer newbie

    Stan Goodman, Jul 3, 2003, in forum: Java
    Replies:
    11
    Views:
    688
    Stan Goodman
    Jul 4, 2003
  2. bd
    Replies:
    0
    Views:
    615
  3. Lance Hoffmeyer

    arrays, even, roundup, odd round down ?

    Lance Hoffmeyer, May 16, 2006, in forum: Python
    Replies:
    2
    Views:
    486
    Serge Orlov
    May 17, 2006
  4. Carsten Fuchs
    Replies:
    45
    Views:
    1,525
    James Kanze
    Oct 8, 2009
  5. Schklerg
    Replies:
    7
    Views:
    115
    Mike Scirocco
    Nov 30, 2003
Loading...

Share This Page