Skip to content

Commit d2c8f52

Browse files
committed
add fp_log2 and fp_log
1 parent e3183be commit d2c8f52

File tree

1 file changed

+50
-0
lines changed
  • source/mir/bignum

1 file changed

+50
-0
lines changed

source/mir/bignum/fp.d

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,3 +460,53 @@ Fp!(coefficientizeA + coefficientizeB) extendedMul(size_t coefficientizeA, size_
460460
}
461461
return typeof(return)(sign, exponent, coefficient);
462462
}
463+
464+
///
465+
template fp_log2(T)
466+
if (__traits(isFloating, T))
467+
{
468+
///
469+
double fp_log2(size_t coefficientSize, Exp = sizediff_t)(Fp!(coefficientSize, Exp) x)
470+
{
471+
import mir.math.common: log2;
472+
auto exponent = x.exponent + coefficientSize;
473+
x.exponent = -coefficientSize;
474+
return log2(cast(double)x) + exponent;
475+
}
476+
}
477+
478+
///
479+
version(mir_test)
480+
@safe pure nothrow @nogc
481+
unittest
482+
{
483+
import mir.math.common: log2, approxEqual;
484+
import mir.bignum.fp: fp_log2;
485+
486+
double x = 123456789.0e+123;
487+
assert(approxEqual(x.Fp!128.fp_log2!double, x.log2));
488+
}
489+
490+
///
491+
template fp_log(T)
492+
if (__traits(isFloating, T))
493+
{
494+
///
495+
double fp_log(size_t coefficientSize, Exp = sizediff_t)(Fp!(coefficientSize, Exp) x)
496+
{
497+
import mir.math.constant: LN2;
498+
return T(LN2) * fp_log2!T(x);
499+
}
500+
}
501+
502+
///
503+
version(mir_test)
504+
@safe pure nothrow @nogc
505+
unittest
506+
{
507+
import mir.math.common: log, approxEqual;
508+
import mir.bignum.fp: fp_log;
509+
510+
double x = 123456789.0e+123;
511+
assert(approxEqual(x.Fp!128.fp_log!double, x.log));
512+
}

0 commit comments

Comments
 (0)