anchor.diff:  
   class function BigDecimal.Sqrt(const Value: BigDecimal; Precision: Integer): BigDecimal;
   begin
  -  Result := Value.Sqrt(Precision);
  +  Result := Value.Sqrt(System.Math.Max(Precision, DefaultPrecision));
   end;
   
   class function BigDecimal.Sqrt(const Value: BigDecimal): BigDecimal;
   begin
  -  Result := Value.Sqrt(DefaultPrecision);
  +  Result := Value.Sqrt(System.Math.Max(DefaultPrecision, Value.Precision));
   end;
   
   function BigDecimal.Sqrt(Precision: Integer): BigDecimal;
  
positive.code:     Result := Half * (Result + BigDecimal.Divide(Self, Result, Precision * 2));
  
    // Round the result and remove any unnecessary trailing zeroes.
    Result := Result.RoundToScale(RangeCheckedScale(Result.FScale + Precision - Result.Precision), DefaultRoundingMode);
    InPlaceRemoveTrailingZeros(Result, System.Math.Min(Self.Scale, Self.Scale div 2));
  end;
  
  
negative.code:   // remove as many trailing zeroes as possible to get as close as possible to the target scale without
    // changing the value.
    // This should be optional, as it is slower.
  //$$RV  if FReduceTrailingZeros then
  //$$RV    InPlaceRemoveTrailingZeros(Result, TargetScale);
  
    // Finally, set the sign of the result.
    Result.FValue.Sign := LSign;
  