Changeset 982


Ignore:
Timestamp:
Sep 26, 2011, 2:00:52 AM (10 years ago)
Author:
sam
Message:

core: add rounding to real->double conversion, fix a bug in the addition
code shortcut, fix bugs in the addition and subtraction, another one in
the multiplication code, and add new unit tests for most of these.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/real.cpp

    r976 r982  
    9292        u.x <<= 4;
    9393        u.x |= m_mantissa[3] >> 12;
     94        /* Rounding */
     95        u.x += (m_mantissa[3] >> 11) & 1;
    9496    }
    9597
     
    110112
    111113    /* Ensure both arguments are positive. Otherwise, switch signs,
    112      * or replace + with -). */
     114     * or replace + with -. */
    113115    if (m_signexp >> 31)
    114116        return -(-*this + -x);
    115117
    116118    if (x.m_signexp >> 31)
    117         return *this - x;
     119        return *this - (-x);
    118120
    119121    /* Ensure *this is the larger exponent (no need to be strictly larger,
     
    138140        if (i - bigoff >= 0)
    139141            carry += x.m_mantissa[i - bigoff] >> off;
    140         else if (i - bigoff == -1)
    141             carry += 0x0001u >> off;
    142142
    143143        if (i - bigoff > 0)
     
    172172
    173173    /* Ensure both arguments are positive. Otherwise, switch signs,
    174      * or replace - with +). */
     174     * or replace - with +. */
    175175    if (m_signexp >> 31)
    176176        return -(-*this + x);
     
    207207        if (i - bigoff >= 0)
    208208            carry -= x.m_mantissa[i - bigoff] >> off;
    209         else if (i - bigoff == -1)
    210             carry -= 0x0001u >> off;
    211209
    212210        if (i - bigoff > 0)
     
    274272    /* Accumulate low order product; no need to store it, we just
    275273     * want the carry value */
    276     uint32_t carry = 0;
     274    uint64_t carry = 0;
    277275    for (int i = 0; i < BIGITS; i++)
    278276    {
    279277        for (int j = 0; j < i + 1; j++)
    280             carry += m_mantissa[BIGITS - 1 - j]
    281                    * x.m_mantissa[BIGITS - 1 + j - i];
     278            carry += (uint32_t)m_mantissa[BIGITS - 1 - j]
     279                   * (uint32_t)x.m_mantissa[BIGITS - 1 + j - i];
    282280        carry >>= 16;
    283281    }
     
    286284    {
    287285        for (int j = i + 1; j < BIGITS; j++)
    288             carry += m_mantissa[BIGITS - 1 - j]
    289                    * x.m_mantissa[j - 1 - i];
     286            carry += (uint32_t)m_mantissa[BIGITS - 1 - j]
     287                   * (uint32_t)x.m_mantissa[j - 1 - i];
    290288
    291289        carry += m_mantissa[BIGITS - 1 - i];
  • trunk/test/unit/real.cpp

    r979 r982  
    9898        float a4 = real(-1.0f) + real(-1.0f);
    9999        float a5 = real(1.0f) + real(0.125f);
     100        double a6 = real(3.13609818956293918)
     101                  + real(0.00005972154828114);
     102        float a7 = real(1.0f) + real(-0.125f);
     103        double a8 = real(0.10000000002) + real(-2.0e-11);
    100104
    101105        LOLUNIT_ASSERT_EQUAL(a1, 1.0f);
     
    104108        LOLUNIT_ASSERT_EQUAL(a4, -2.0f);
    105109        LOLUNIT_ASSERT_EQUAL(a5, 1.125f);
     110        LOLUNIT_ASSERT_DOUBLES_EQUAL(a6, 3.1361579, 0.000001);
     111        LOLUNIT_ASSERT_EQUAL(a7, 0.875f);
     112        LOLUNIT_ASSERT_DOUBLES_EQUAL(a8, 0.1, 1.0e-13);
    106113    }
    107114
     
    140147        float m3 = a1 / a2;
    141148        float m4 = a2 / a2;
     149        float m5 = a1 / -a2;
    142150
    143151        LOLUNIT_ASSERT_EQUAL(m1, 1.0f);
     
    145153        LOLUNIT_ASSERT_EQUAL(m3, 0.5f);
    146154        LOLUNIT_ASSERT_EQUAL(m4, 1.0f);
     155        LOLUNIT_ASSERT_EQUAL(m5, -0.5f);
    147156    }
    148157};
Note: See TracChangeset for help on using the changeset viewer.