Changeset 1003


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

core: implement round() and fmod() for real numbers.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/real.cpp

    r1002 r1003  
    684684    else
    685685        return ret + real::R_1;
     686}
     687
     688real round(real const &x)
     689{
     690    if (x < real::R_0)
     691        return -round(-x);
     692
     693    return floor(x + (real::R_1 >> 1));
     694}
     695
     696real fmod(real const &x, real const &y)
     697{
     698    if (!y)
     699        return real::R_0; /* FIXME: return NaN */
     700
     701    if (!x)
     702        return x;
     703
     704    real tmp = round(x / y);
     705    return x - tmp * y;
    686706}
    687707
  • trunk/src/real.h

    r1002 r1003  
    7272    friend real floor(real const &x);
    7373    friend real ceil(real const &x);
     74    friend real round(real const &x);
     75    friend real fmod(real const &x, real const &y);
    7476
    7577    friend real sin(real const &x);
  • trunk/test/unit/real.cpp

    r1002 r1003  
    258258    }
    259259
    260     LOLUNIT_TEST(FloorCeil)
     260    LOLUNIT_TEST(FloorCeilEtc)
    261261    {
    262262        double tests[] =
    263263        {
    264             -2.0,  -2.0, -2.0,
    265             -1.5,  -2.0, -1.0,
    266             -1.0,  -1.0, -1.0,
    267             -0.0,  -0.0, -0.0,
    268              0.0,   0.0,  0.0,
    269              0.25,  0.0,  1.0,
    270              0.375, 0.0,  1.0,
    271              0.5,   0.0,  1.0,
    272              1.0,   1.0,  1.0,
    273              1.5,   1.0,  2.0,
    274              2.0,   2.0,  2.0,
    275              2.5,   2.0,  3.0,
    276              3.0,   3.0,  3.0,
    277             8192.0,     8192.0, 8192.0,
    278             8192.03125, 8192.0, 8193.0,
    279             8192.5,     8192.0, 8193.0,
    280             8193.0,     8193.0, 8193.0,
    281             549755813888.0,     549755813888.0, 549755813888.0,
    282             549755813888.03125, 549755813888.0, 549755813889.0,
    283             549755813888.5,     549755813888.0, 549755813889.0,
    284             549755813889.0,     549755813889.0, 549755813889.0,
     264            -2.0,  -2.0, -2.0,  -2.0,
     265            -1.5,  -2.0, -1.0,  -2.0,
     266            -1.0,  -1.0, -1.0,  -1.0,
     267            -0.0,  -0.0, -0.0,  -0.0,
     268             0.0,   0.0,  0.0,   0.0,
     269             0.25,  0.0,  1.0,   0.0,
     270             0.375, 0.0,  1.0,   0.0,
     271             0.5,   0.0,  1.0,   1.0,
     272             1.0,   1.0,  1.0,   1.0,
     273             1.5,   1.0,  2.0,   2.0,
     274             2.0,   2.0,  2.0,   2.0,
     275             2.5,   2.0,  3.0,   3.0,
     276             3.0,   3.0,  3.0,   3.0,
     277            8192.0,     8192.0, 8192.0, 8192.0,
     278            8192.03125, 8192.0, 8193.0, 8192.0,
     279            8192.5,     8192.0, 8193.0, 8193.0,
     280            8193.0,     8193.0, 8193.0, 8193.0,
     281            549755813888.0,     549755813888.0, 549755813888.0, 549755813888.0,
     282            549755813888.03125, 549755813888.0, 549755813889.0, 549755813888.0,
     283            549755813888.5,     549755813888.0, 549755813889.0, 549755813889.0,
     284            549755813889.0,     549755813889.0, 549755813889.0, 549755813889.0,
    285285        };
    286286
    287         for (unsigned int n = 0; n < sizeof(tests) / sizeof(*tests); n += 3)
     287        for (unsigned int n = 0; n < sizeof(tests) / sizeof(*tests); n += 4)
    288288        {
    289289            double a0 = floor((real)tests[n]);
     
    291291            double a1 = ceil((real)tests[n]);
    292292            double b1 = tests[n + 2];
     293            double a2 = round((real)tests[n]);
     294            double b2 = tests[n + 3];
    293295
    294296            LOLUNIT_ASSERT_EQUAL(b0, a0);
    295297            LOLUNIT_ASSERT_EQUAL(b1, a1);
     298            LOLUNIT_ASSERT_EQUAL(b2, a2);
    296299        }
    297300    }
Note: See TracChangeset for help on using the changeset viewer.