protected internal override BigNum Ceiling() { // using the identity ceil(x) == -floor(-x) BigFloat floored = (BigFloat)Negate().Floor(); return(floored.Negate()); }
private static BigFloat Subtract(BigFloat a, BigFloat b, Boolean normalise) { a.Normalise(); b.Normalise(); a = (BigFloat)a.Clone(); b = (BigFloat)b.Clone(); if (a.IsZero && b.IsZero) { return(a); } if (a.Sign && !b.Sign) { b._sign = true; return(Add(a, b, normalise)); } if (!a.Sign && b.Sign) { a._sign = true; BigFloat added = Add(a, b, normalise); return((BigFloat)added.Negate()); } BigFloat result = new BigFloat(); a.AlignExponent(b); b.AlignExponent(a); result._exp = a._exp; Boolean wasSwapped = false; if (b.Length > a.Length) // then switch them around { BigFloat temp = a; a = b; b = temp; wasSwapped = true; } else { // if same length, check magnitude BigFloat a1 = (BigFloat)a.Absolute(); BigFloat b1 = (BigFloat)b.Absolute(); if (a1 < b1) { BigFloat temp = a; a = b; b = temp; wasSwapped = true; } else if (!(a1 > b1)) // i.e. equal { return(new BigFloat()); // return zero } } // Do work // it's a sad day when the preparation for an operation is just as long as the operation itself SByte digit = 0; SByte take = 0; for (int i = 0; i < b.Length; i++) { digit = (SByte)(a[i] - b[i] - take); if (digit < 0) { take = 1; digit = (SByte)(10 + digit); } else { take = 0; } result._data.Add(digit); } for (int i = b.Length; i < a.Length; i++) { digit = (SByte)(a[i] - take); if (digit < 0) { take = 1; digit = (SByte)(10 + digit); } else { take = 0; } result._data.Add(digit); } result._sign = a.Sign && b.Sign ? !wasSwapped : wasSwapped; /* if(normalise) * result.Normalise(); */ return(result); }