Changeset 890


Ignore:
Timestamp:
Sep 2, 2011, 2:28:41 AM (8 years ago)
Author:
sam
Message:

core: remove one multiplication and one selection from the optimised
version of sinf().

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/trig.cpp

    r888 r890  
    2525
    2626static const double PI     = 3.14159265358979323846;
     27static const double NEG_PI = -3.14159265358979323846;
    2728static const double PI_2   = PI / 2.0;
    2829static const double PI_4   = PI / 4.0;
     
    3637static const double TWO     = 2.0;
    3738static const double VERY_SMALL_NUMBER = 0x1.0p-128;
    38 static const double VERY_LARGE_NUMBER = 4503599627370496.0;
    39 static const double EVEN_LARGER_NUMBER = 9007199254740992.0;
     39static const double TWO_EXP_52 = 4503599627370496.0;
     40static const double TWO_EXP_54 = 18014398509481984.0;
    4041
    4142/** sin Taylor series coefficients. */
    4243static const double SC[]    =
    4344{
    44     -1.6666666666666666666667e-01, // 1/3!
    45     +8.3333333333333333333333e-03, // 1/5!
    46     -1.9841269841269841269841e-04, // 1/7!
    47     +2.7557319223985890652557e-06, // 1/9!
    48     -2.5052108385441718775052e-08, // 1/11!
    49     +1.6059043836821614599392e-10, // 1/13!
    50     -7.6471637318198164759011e-13, // 1/15!
    51     +2.8114572543455207631989e-15, // 1/17!
     45    -1.6449340668482264364724e-0, // pi^2/3!
     46    +8.1174242528335364363700e-1, // pi^4/5!
     47    -1.9075182412208421369647e-1, // pi^6/7!
     48    +2.6147847817654800504653e-2, // pi^8/9!
     49    -2.3460810354558236375089e-3, // pi^10/11!
     50    +1.4842879303107100368487e-4, // pi^12/13!
     51    -6.9758736616563804745344e-6, // pi^14/15!
     52    +2.5312174041370276513517e-7, // pi^16/17!
    5253};
    5354
     
    166167double lol_sin(double x)
    167168{
    168     double absx = lol_fabs(x);
    169     double sign = lol_fsel(x, ONE, NEG_ONE);
     169    double absx = lol_fabs(x * INV_PI);
     170    double sign = lol_fsel(x, PI, NEG_PI);
    170171#if defined __CELLOS_LV2__
    171     double num_cycles = lol_round(absx * INV_PI);
     172    double num_cycles = lol_round(absx);
    172173    double is_even = lol_trunc(num_cycles * HALF) - (num_cycles * HALF);
     174    sign = lol_fsel(is_even, sign, -sign);
    173175#else
    174     double num_cycles = absx * INV_PI + VERY_LARGE_NUMBER;
    175     __asm__("" : "+m" (num_cycles));
    176     num_cycles -= VERY_LARGE_NUMBER;
     176    double num_cycles = absx + TWO_EXP_52;
     177    __asm__("" : "+m" (num_cycles)); num_cycles -= TWO_EXP_52;
    177178
    178     double is_even = num_cycles - HALF;
     179    double is_even = TWO * num_cycles - ONE;
     180    __asm__("" : "+m" (is_even)); is_even += TWO_EXP_54;
     181    __asm__("" : "+m" (is_even)); is_even -= TWO_EXP_54;
    179182    __asm__("" : "+m" (is_even));
    180     is_even += EVEN_LARGER_NUMBER;
    181     __asm__("" : "+m" (is_even));
    182     is_even -= EVEN_LARGER_NUMBER;
    183     __asm__("" : "+m" (is_even));
    184     is_even -= num_cycles;
     183    is_even -= TWO * num_cycles - ONE;
     184    sign *= is_even;
    185185#endif
    186     double norm_x = absx - PI * num_cycles;
     186    double norm_x = absx - num_cycles;
    187187    double y = norm_x * norm_x;
    188     double taylor = ((((((((SC[7] * y + SC[6]) * y + SC[5])
    189                                   * y + SC[4]) * y + SC[3])
    190                                   * y + SC[2]) * y + SC[1])
    191                                   * y + SC[0]) * y);
    192     sign = lol_fsel(is_even, sign, -sign);
    193     double result = norm_x + norm_x * taylor;
     188    double taylor = (((((((SC[7] * y + SC[6]) * y + SC[5])
     189                                 * y + SC[4]) * y + SC[3])
     190                                 * y + SC[2]) * y + SC[1])
     191                                 * y + SC[0]) * y + ONE;
     192    double result = norm_x * taylor;
    194193    return result * sign;
    195194}
  • trunk/test/lol-bench.cpp

    r886 r890  
    5151
    5252    Log::Info("----------------------------\n");
     53    Log::Info(" Trigonometry [-1e-2, 1e-2]\n");
     54    Log::Info("----------------------------\n");
     55    bench_trig(3);
     56
     57    Log::Info("----------------------------\n");
    5358    Log::Info(" Float matrices [-2.0, 2.0]\n");
    5459    Log::Info("----------------------------\n");
     
    8893            for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
    8994                pf[i] = RandF(-M_PI, M_PI);
     95            break;
     96        case 3:
     97            for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
     98                pf[i] = RandF(-1e-2f, 1e-2f);
    9099            break;
    91100        }
Note: See TracChangeset for help on using the changeset viewer.