COIN-OR::LEMON - Graph Library

Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/random.h

    r487 r482  
    345345    };
    346346
     347    template <typename Result, int exp, bool pos = (exp >= 0)>
     348    struct ShiftMultiplier {
     349      static const Result multiplier() {
     350        Result res = ShiftMultiplier<Result, exp / 2>::multiplier();
     351        res *= res;
     352        if ((exp & 1) == 1) res *= static_cast<Result>(2.0);
     353        return res;
     354      }
     355    };
     356
    347357    template <typename Result, int exp>
    348     struct ShiftMultiplier {
     358    struct ShiftMultiplier<Result, exp, false> {
    349359      static const Result multiplier() {
    350360        Result res = ShiftMultiplier<Result, exp / 2>::multiplier();
     
    356366
    357367    template <typename Result>
    358     struct ShiftMultiplier<Result, 0> {
     368    struct ShiftMultiplier<Result, 0, true> {
    359369      static const Result multiplier() {
    360370        return static_cast<Result>(1.0);
     
    363373
    364374    template <typename Result>
    365     struct ShiftMultiplier<Result, 20> {
     375    struct ShiftMultiplier<Result, -20, true> {
    366376      static const Result multiplier() {
    367377        return static_cast<Result>(1.0/1048576.0);
     
    370380
    371381    template <typename Result>
    372     struct ShiftMultiplier<Result, 32> {
     382    struct ShiftMultiplier<Result, -32, true> {
    373383      static const Result multiplier() {
    374         return static_cast<Result>(1.0/4294967296.0);
     384        return static_cast<Result>(1.0/424967296.0);
    375385      }
    376386    };
    377387
    378388    template <typename Result>
    379     struct ShiftMultiplier<Result, 53> {
     389    struct ShiftMultiplier<Result, -53, true> {
    380390      static const Result multiplier() {
    381391        return static_cast<Result>(1.0/9007199254740992.0);
     
    384394
    385395    template <typename Result>
    386     struct ShiftMultiplier<Result, 64> {
     396    struct ShiftMultiplier<Result, -64, true> {
    387397      static const Result multiplier() {
    388398        return static_cast<Result>(1.0/18446744073709551616.0);
     
    404414
    405415      static Result convert(RandomCore<Word>& rnd) {
    406         return Shifting<Result, shift + rest>::
     416        return Shifting<Result, - shift - rest>::
    407417          shift(static_cast<Result>(rnd() >> (bits - rest)));
    408418      }
     
    414424
    415425      static Result convert(RandomCore<Word>& rnd) {
    416         return Shifting<Result, shift + bits>::
     426        return Shifting<Result, - shift - bits>::
    417427          shift(static_cast<Result>(rnd())) +
    418428          RealConversion<Result, Word, rest-bits, shift + bits>::
Note: See TracChangeset for help on using the changeset viewer.