CTFE log2 functions

Shire degener_trash at mail.ru
Sun Apr 6 00:58:10 PDT 2014


Another one ctfe log2, integer and real versions:

[code]
module util.ctfelog2;

uint ctfe_ilog2(ulong arg) pure {
    assert(arg != 0);
    uint result = 0;
    while(arg >>= 1)
      result++;
    return result;
}

ulong ctfe_log2(real arg, uint fracBits) pure {
    import std.math : sqrt, SQRT2;
    uint intPart = ctfe_ilog2(cast(ulong)arg);
    ulong result = intPart;
    if(fracBits == 0 || arg == (1 << intPart))
      return result << fracBits;
    real sq = arg / (1 << intPart);
    for(uint i = fracBits; i; i--) {
      if(sq > 2) {
        result |= 1;
        sq /= 2;
      }
      sq *= sq;
      result <<= 1;
    }
    return result;
}

real ctfe_log2(real arg) pure {
    return ctfe_log2(arg, 56) / cast(real)(1UL << 56);
}

unittest {
    import std.math : log2, abs;
    for(real l = 1; l < 256; l += 0.3) {
      double d1 = ctfe_log2(l);
      double d2 = log2(l);
      assert(abs(d1 - d2) < (cast(real)1.0)/(1UL << 48));
    }
}
[/code]


More information about the Digitalmars-d-learn mailing list