Ignore:
Timestamp:
Oct 3, 2011, 1:36:28 AM (11 years ago)
Author:
sam
Message:

core: implement floor() and ceil() for real numbers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/real.cpp

    r1001 r1002  
    638638    x1.m_signexp += e0;
    639639    return x1;
     640}
     641
     642real floor(real const &x)
     643{
     644    /* Strategy for floor(x):
     645     *  - if negative, return -ceil(-x)
     646     *  - if zero or negative zero, return x
     647     *  - if less than one, return zero
     648     *  - otherwise, if e is the exponent, clear all bits except the
     649     *    first e. */
     650    if (x < -real::R_0)
     651        return -ceil(-x);
     652    if (!x)
     653        return x;
     654    if (x < real::R_1)
     655        return real::R_0;
     656
     657    real ret = x;
     658    int exponent = x.m_signexp - (1 << 30) + 1;
     659
     660    for (int i = 0; i < real::BIGITS; i++)
     661    {
     662        if (exponent <= 0)
     663            ret.m_mantissa[i] = 0;
     664        else if (exponent < 8 * (int)sizeof(uint16_t))
     665            ret.m_mantissa[i] &= ~((1 << (16 - exponent)) - 1);
     666
     667        exponent -= 8 * sizeof(uint16_t);
     668    }
     669
     670    return ret;
     671}
     672
     673real ceil(real const &x)
     674{
     675    /* Strategy for ceil(x):
     676     *  - if negative, return -floor(-x)
     677     *  - if x == floor(x), return x
     678     *  - otherwise, return floor(x) + 1 */
     679    if (x < -real::R_0)
     680        return -floor(-x);
     681    real ret = floor(x);
     682    if (x == ret)
     683        return ret;
     684    else
     685        return ret + real::R_1;
    640686}
    641687
Note: See TracChangeset for help on using the changeset viewer.