anchor.diff:  function BigInteger.Log2: Double;
   begin
     Result := Log(Self, 2.0);
  +end;
  +
  +// https://stackoverflow.com/a/7982137/95954
  +class function BigInteger.Exp(const b: Double): BigInteger;
  +var
  +  bc, b2, c: Double;
  +  t: Integer;
  +begin
  +  if IsNan(b) or IsInfinite(b) then
  +    Error(ecInvalidArgFloat, ['Double']);
  +  bc := 680.0;
  +  if b < bc then
  +    Exit(BigInteger(System.Exp(b)));
  +  // I think this can be simplified:
  +  c := b - bc;
  +  t := System.Math.Ceil(c / FLog2);
  +  c := t * FLog2;
  +  b2 := b - c;
  +  Result := BigInteger(System.Exp(b2)) shl t;
   end;
   
   class operator BigInteger.LogicalNot(const Value: BigInteger): BigInteger;
  
positive.code: end;
  
  // http://stackoverflow.com/a/7982137/95954
  class function BigInteger.Ln(const Value: BigInteger): Double;
  var
    BLex: Integer;
    NewInt: BigInteger;
  begin
    if Value.IsNegative then
      Exit(System.Math.NaN)
    else if Value.IsZero then
      Exit(System.Math.NegInfinity);
    BLex := Value.BitLength - 1022;
    if BLex > 0 then
      NewInt := Value shr BLex
    else
      NewInt := Value;
    Result := System.Ln(NewInt.AsDouble);
    if BLex > 0 then
      Result := Result + BLex * System.Ln(2.0);
  end;
  
  class function BigInteger.Log(const Value: BigInteger; Base: Double): Double;
  
negative.code: 
      /// <summary>Returns the logarithm to base 10 of the current BigInteger.</summary>
      function Log10: Double; overload;
  
      /// <summary>The reverse of BigInteger.Ln. Returns e^Value, for very large Value, as BigInteger
      class function Exp(const b: Double): BigInteger; static;
  
      /// <summary>Returns the larger of two specified values.</summary>
      class function Max(const Left, Right: BigInteger): BigInteger; static;
  