@@ -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