Exemplo n.º 1
0
        /////////////////////////////////////////////////////////////////////////////////////

        public bool Visit(VCExprLiteral node, LineariserOptions options)
        {
            if (node == VCExpressionGenerator.True)
            {
                wr.Write("true");
            }
            else if (node == VCExpressionGenerator.False)
            {
                wr.Write("false");
            }
            else if (node is VCExprIntLit)
            {
                BigNum lit = ((VCExprIntLit)node).Val;
                if (lit.IsNegative)
                {
                    // In SMT2 "-42" is an identifier (SMT2, Sect. 3.2 "Symbols")
                    wr.Write("(- 0 {0})", lit.Abs);
                }
                else
                {
                    wr.Write(lit);
                }
            }
            else if (node is VCExprRealLit)
            {
                BigDec lit = ((VCExprRealLit)node).Val;
                if (lit.IsNegative)
                {
                    // In SMT2 "-42" is an identifier (SMT2, Sect. 3.2 "Symbols")
                    wr.Write("(- 0.0 {0})", lit.Abs.ToDecimalString());
                }
                else
                {
                    wr.Write(lit.ToDecimalString());
                }
            }
            else if (node is VCExprFloatLit)
            {
                BigFloat lit = ((VCExprFloatLit)node).Val;
                wr.Write("(" + lit.ToBVString() + ")");
            }
            else if (node is VCExprRModeLit)
            {
                RoundingMode lit = ((VCExprRModeLit)node).Val;
                wr.Write(lit.ToString());
            }
            else if (node is VCExprStringLit)
            {
                String lit = ((VCExprStringLit)node).Val;
                wr.Write("\"" + lit.ToString() + "\"");
            }
            else
            {
                Contract.Assert(false);
                throw new cce.UnreachableException();
            }

            return(true);
        }
Exemplo n.º 2
0
 public override string ToString()
 {
     return(string.Format(_FCS, "Precision = {0} RoundingMode = {1}", Precision, RoundingMode.ToString()));
 }
Exemplo n.º 3
0
        public static decimal Round(this decimal value, int decimalPlaces, RoundingMode mode)
        {
            //http://en.wikipedia.org/wiki/Rounding

            int factor = decimalPlaces.PowerOfTen();

            if (mode == RoundingMode.RoundCeiling)
            {
                if (value >= 0)
                {
                    return(RoundUp(value, factor));
                }
                else
                {
                    return(RoundDown(value, factor));
                }
            }
            else if (mode == RoundingMode.RoundFloor)
            {
                if (value >= 0)
                {
                    return(RoundDown(value, factor));
                }
                else
                {
                    return(RoundUp(value, factor));
                }
            }
            else if (mode == RoundingMode.RoundUp)
            {
                return(RoundUp(value, factor));
            }
            else if (mode == RoundingMode.RoundDown)
            {
                return(RoundDown(value, factor));
            }

            decimal absolute          = value.Abs() * factor;
            decimal discardedFraction = absolute.FractionaryPart();

            if (mode == RoundingMode.RoundHalfUp)
            {
                if (discardedFraction >= 0.5M)
                {
                    return(RoundUp(value, factor));
                }
                else
                {
                    return(RoundDown(value, factor));
                }
            }
            else if (mode == RoundingMode.RoundHalfDown)
            {
                if (discardedFraction > 0.5M)
                {
                    return(RoundUp(value, factor));
                }
                else
                {
                    return(RoundDown(value, factor));
                }
            }
            else if (mode == RoundingMode.RoundHalfEven)
            {
                return(Round(value, decimalPlaces, Decimal.Floor(absolute) % 2 == 0 ? RoundingMode.RoundHalfDown : RoundingMode.RoundHalfUp));
            }
            else if (mode == RoundingMode.RoundHalfOdd)
            {
                return(Round(value, decimalPlaces, Decimal.Floor(absolute) % 2 != 0 ? RoundingMode.RoundHalfDown : RoundingMode.RoundHalfUp));
            }

            throw new ArgumentException("Rounding type " + mode.ToString() + " is not recognized");
        }