本文整理汇总了C#中BigDecimal.Add方法的典型用法代码示例。如果您正苦于以下问题:C# BigDecimal.Add方法的具体用法?C# BigDecimal.Add怎么用?C# BigDecimal.Add使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BigDecimal
的用法示例。
在下文中一共展示了BigDecimal.Add方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Add
public void Add(string a, int aScale, string b, int bScale, string c, int cScale)
{
BigDecimal aNumber = new BigDecimal(BigInteger.Parse(a), aScale);
BigDecimal bNumber = new BigDecimal(BigInteger.Parse(b), bScale);
BigDecimal result = aNumber.Add(bNumber);
Assert.AreEqual(c, result.ToString(), "incorrect value");
Assert.AreEqual(cScale, result.Scale, "incorrect scale");
}
示例2: AddWithContext
public void AddWithContext(string a, int aScale, string b, int bScale, string c, int cScale, int precision, RoundingMode mode)
{
BigDecimal aNumber = new BigDecimal(BigInteger.Parse(a), aScale);
BigDecimal bNumber = new BigDecimal(BigInteger.Parse(b), bScale);
MathContext mc = new MathContext(precision, mode);
BigDecimal result = aNumber.Add(bNumber, mc);
Assert.AreEqual(c, result.ToString(), "incorrect value");
Assert.AreEqual(cScale, result.Scale, "incorrect scale");
}
示例3: Zeta
public static BigDecimal Zeta(int n, MathContext mc)
{
if (n <= 0)
throw new NotSupportedException("Zeta at negative argument " + n + " not supported");
if (n == 1)
throw new ArithmeticException("Pole at zeta(1) ");
if (n%2 == 0) {
/* Even indices. Abramowitz-Stegun 23.2.16. Start with 2^(n-1)*B(n)/n!
*/
Rational b = Bernoulli.Default[n].Abs();
b = b.Divide(Factorial.Default[n]);
b = b.Multiply(BigInteger.One.ShiftLeft(n - 1));
/* to be multiplied by pi^n. Absolute error in the result of pi^n is n times
* error in pi times pi^(n-1). Relative error is n*error(pi)/pi, requested by mc.
* Need one more digit in pi if n=10, two digits if n=100 etc, and add one extra digit.
*/
var mcpi = new MathContext(mc.Precision + (int) (System.Math.Log10(10.0*n)));
BigDecimal piton = PiRound(mcpi).Pow(n, mc);
return MultiplyRound(piton, b);
}
if (n == 3) {
/* Broadhurst BBP <a href="http://arxiv.org/abs/math/9803067">arXiv:math/9803067</a>
* Error propagation: S31 is roughly 0.087, S33 roughly 0.131
*/
int[] a31 = {1, -7, -1, 10, -1, -7, 1, 0};
int[] a33 = {1, 1, -1, -2, -1, 1, 1, 0};
BigDecimal S31 = BroadhurstBbp(3, 1, a31, mc);
BigDecimal S33 = BroadhurstBbp(3, 3, a33, mc);
S31 = S31.Multiply(new BigDecimal(48));
S33 = S33.Multiply(new BigDecimal(32));
return S31.Add(S33).Divide(new BigDecimal(7), mc);
}
if (n == 5) {
/* Broadhurst BBP <a href=http://arxiv.org/abs/math/9803067">arXiv:math/9803067</a>
* Error propagation: S51 is roughly -11.15, S53 roughly 22.165, S55 is roughly 0.031
* 9*2048*S51/6265 = -3.28. 7*2038*S53/61651= 5.07. 738*2048*S55/61651= 0.747.
* The result is of the order 1.03, so we add 2 digits to S51 and S52 and one digit to S55.
*/
int[] a51 = {31, -1614, -31, -6212, -31, -1614, 31, 74552};
int[] a53 = {173, 284, -173, -457, -173, 284, 173, -111};
int[] a55 = {1, 0, -1, -1, -1, 0, 1, 1};
BigDecimal S51 = BroadhurstBbp(5, 1, a51, new MathContext(2 + mc.Precision));
BigDecimal S53 = BroadhurstBbp(5, 3, a53, new MathContext(2 + mc.Precision));
BigDecimal S55 = BroadhurstBbp(5, 5, a55, new MathContext(1 + mc.Precision));
S51 = S51.Multiply(new BigDecimal(18432));
S53 = S53.Multiply(new BigDecimal(14336));
S55 = S55.Multiply(new BigDecimal(1511424));
return S51.Add(S53).Subtract(S55).Divide(new BigDecimal(62651), mc);
}
/* Cohen et al Exp Math 1 (1) (1992) 25
*/
var betsum = new Rational();
var bern = new Bernoulli();
var fact = new Factorial();
for (int npr = 0; npr <= (n + 1)/2; npr++) {
Rational b = bern[2*npr].Multiply(bern[n + 1 - 2*npr]);
b = b.Divide(fact[2*npr]).Divide(fact[n + 1 - 2*npr]);
b = b.Multiply(1 - 2*npr);
if (npr%2 == 0)
betsum = betsum.Add(b);
else
betsum = betsum.Subtract(b);
}
betsum = betsum.Divide(n - 1);
/* The first term, including the facor (2pi)^n, is essentially most
* of the result, near one. The second term below is roughly in the range 0.003 to 0.009.
* So the precision here is matching the precisionn requested by mc, and the precision
* requested for 2*pi is in absolute terms adjusted.
*/
var mcloc = new MathContext(2 + mc.Precision + (int) (System.Math.Log10(n)));
BigDecimal ftrm = PiRound(mcloc).Multiply(new BigDecimal(2));
ftrm = ftrm.Pow(n);
ftrm = MultiplyRound(ftrm, betsum.ToBigDecimal(mcloc));
var exps = new BigDecimal(0);
/* the basic accuracy of the accumulated terms before multiplication with 2
*/
double eps = System.Math.Pow(10d, -mc.Precision);
if (n%4 == 3) {
/* since the argument n is at least 7 here, the drop
* of the terms is at rather constant pace at least 10^-3, for example
* 0.0018, 0.2e-7, 0.29e-11, 0.74e-15 etc for npr=1,2,3.... We want 2 times these terms
* fall below eps/10.
*/
int kmax = mc.Precision/3;
eps /= kmax;
/* need an error of eps for 2/(exp(2pi)-1) = 0.0037
* The absolute error is 4*exp(2pi)*err(pi)/(exp(2pi)-1)^2=0.0075*err(pi)
*/
BigDecimal exp2p = PiRound(new MathContext(3 + ErrorToPrecision(3.14, eps/0.0075)));
exp2p = Exp(exp2p.Multiply(new BigDecimal(2)));
BigDecimal c = exp2p.Subtract(BigDecimal.One);
exps = DivideRound(1, c);
for (int npr = 2; npr <= kmax; npr++) {
/* the error estimate above for npr=1 is the worst case of
* the absolute error created by an error in 2pi. So we can
* safely re-use the exp2p value computed above without
//.........这里部分代码省略.........
示例4: AddRound
public static BigDecimal AddRound(BigDecimal x, BigDecimal y)
{
BigDecimal resul = x.Add(y);
/* The estimation of the absolute error in the result is |err(y)|+|err(x)|
*/
double errR = System.Math.Abs(y.Ulp().ToDouble()/2d) + System.Math.Abs(x.Ulp().ToDouble()/2d);
MathContext mc = new MathContext(ErrorToPrecision(resul.ToDouble(), errR));
return resul.Round(mc);
}
示例5: Sqrt
public static BigDecimal Sqrt(BigDecimal x, MathContext mc)
{
if (x.CompareTo(BigDecimal.Zero) < 0)
throw new ArithmeticException("negative argument " + x + " of square root");
if (x.Abs().Subtract(new BigDecimal(System.Math.Pow(10d, -mc.Precision))).CompareTo(BigDecimal.Zero) < 0)
return ScalePrecision(BigDecimal.Zero, mc);
/* start the computation from a double precision estimate */
var s = new BigDecimal(System.Math.Sqrt(x.ToDouble()), mc);
BigDecimal half = BigDecimal.ValueOf(2);
/* increase the local accuracy by 2 digits */
var locmc = new MathContext(mc.Precision + 2, mc.RoundingMode);
/* relative accuracy requested is 10^(-precision)
*/
double eps = System.Math.Pow(10.0, -mc.Precision);
while (true) {
/* s = s -(s/2-x/2s); test correction s-x/s for being
* smaller than the precision requested. The relative correction is 1-x/s^2,
* (actually half of this, which we use for a little bit of additional protection).
*/
if (System.Math.Abs(BigDecimal.One.Subtract(x.Divide(s.Pow(2, locmc), locmc)).ToDouble()) < eps)
break;
s = s.Add(x.Divide(s, locmc)).Divide(half, locmc);
}
return s;
}
示例6: Add
public static BigDecimal Add(BigDecimal x, BigInteger y)
{
return x.Add(new BigDecimal(y));
}
示例7: Calculate
public override Number Calculate(BigDecimal bigDecimal1, BigDecimal bigDecimal2)
{
if (bigDecimal1 == null || bigDecimal2 == null)
{
return 0;
}
return bigDecimal1.Add(bigDecimal2);
}
示例8: ToDouble
public void ToDouble()
{
BigDecimal bigDB = new BigDecimal(-1.234E-112);
// Commenting out this part because it causes an endless loop (see HARMONY-319 and HARMONY-329)
// Assert.IsTrue(
// "the double representation of this BigDecimal is not correct",
// bigDB.ToDouble() == -1.234E-112);
bigDB = new BigDecimal(5.00E-324);
Assert.IsTrue(bigDB.ToDouble() == 5.00E-324, "the double representation of bigDecimal is not correct");
bigDB = new BigDecimal(1.79E308);
Assert.IsTrue(bigDB.ToDouble() == 1.79E308 && bigDB.Scale == 0,
"the double representation of bigDecimal is not correct");
bigDB = new BigDecimal(-2.33E102);
Assert.IsTrue(bigDB.ToDouble() == -2.33E102 && bigDB.Scale == 0,
"the double representation of bigDecimal -2.33E102 is not correct");
bigDB = new BigDecimal(Double.MaxValue);
bigDB = bigDB.Add(bigDB);
Assert.IsTrue(bigDB.ToDouble() == Double.PositiveInfinity,
"a + number out of the double range should return infinity");
bigDB = new BigDecimal(-Double.MaxValue);
bigDB = bigDB.Add(bigDB);
Assert.IsTrue(bigDB.ToDouble() == Double.NegativeInfinity,
"a - number out of the double range should return neg infinity");
}