/// <summary>
        /// Returns aligned rightOperand relative to leftOperand.
        /// IMPORTANT: leftOperand must be greater or equal (>=) to rightOperand
        /// </summary>
        /// <param name="leftOperand">Operand, relative to which rightOperand will be aligned.</param>
        /// <param name="rightOperand">Operand, that will be aligned</param>
        /// <returns>Aligned operand.</returns>
        public static PBNumber ExponentAlign(PBNumber leftOperand, PBNumber rightOperand)
        {
            PBConvertion pbconvertion = new PBConvertion();
            int leftExponentValue = Int32.Parse(pbconvertion.convert2to10IPart(leftOperand.Exponent));
            int rightExponentValue = Int32.Parse(pbconvertion.convert2to10IPart(rightOperand.Exponent));

            return Shift(rightOperand, leftExponentValue - rightExponentValue);
        }
        public Command(CommandBase.commVals inCommandInstruction, Object inValue)
        {
            switch (inCommandInstruction)
                {
                    case commVals.Load:
                        this.Code = (int)inCommandInstruction;
                        try
                        {
                            if (inValue.GetType() == typeof(int))
                            {
                                this.leftOperand = null;
                                this.MemoryCellNeeded = (int)inValue;
                            }
                            else
                                this.leftOperand = (PBNumber)inValue;
                        }
                        catch (Exception ex)
                        {
                            throw new IncorrectOperandType("Command(" + inCommandInstruction + ", " + inValue + ")=[ " + ex.Message + " ]");
                        }

                        break;
                    case commVals.Mem:
                        this.Code = (int)inCommandInstruction;
                        try
                        {
                            this.MemoryCellUsed = (int)inValue;
                        }
                        catch (Exception ex)
                        {
                            throw new IncorrectMemoryCellAddress("Command(" + inCommandInstruction + ", " + (String)inValue + ")=[ " + ex.Message + " ]");
                        }

                        break;
                    default :
                        this.Code = (int)inCommandInstruction;
                        try
                        {
                            if (inValue.GetType() == typeof(int))
                            {
                                this.leftOperand = null;
                                this.MemoryCellNeeded = (int)inValue;
                            }
                            else
                                this.leftOperand = (PBNumber)inValue;
                        }
                        catch (Exception ex)
                        {
                            throw new IncorrectOperandType("Command(" + inCommandInstruction + ", " + inValue + ")=[ " + ex.Message + " ]");
                        }
                        break;
                }
        }
        /// <summary>
        /// PBNumber multiplication
        /// </summary>
        /// <param name="leftOperand"></param>
        /// <param name="rightOperand"></param>
        /// <returns></returns>
        public static PBNumber pMUL(PBNumber leftOperand, PBNumber rightOperand)
        {
            PBNumber result = new PBNumber("0", IPBNumber.NumberCapacity.PB128, IPBNumber.RoundingType.POST_BINARY);
            PBNumber[] alignedExponent = exponentsAlign((PBNumber)leftOperand.Clone(), (PBNumber)rightOperand.Clone());
            PBNumber opA = alignedExponent[0];
            PBNumber opB = alignedExponent[1];

            result.Exponent = tADD(leftOperand.Exponent, rightOperand.Exponent, false);
            result.Mantissa = pMUL_mantissa(leftOperand.Mantissa, rightOperand.Mantissa);
            result.Sign = tXOR(leftOperand.Sign, rightOperand.Sign);

            return result;
        }
        public void calcResForInf(PBNumber inNumber, int precision)
        {
            String Sign;
            try
            {
                /* Sign */
                /*
                if ((z == 0) || (NumberFormat == 0))
                    Sign = SignCharacterLeft;
                else
                    Sign = SignCharacterRight;
                inNumber.CorrectResult = DenormalizedNumber;
                inNumber.CorrectResultExp = NormalizedNumber;

                inNumber.CorrectResult2cc = Sign + convert10to2IPart(DenormIntPart) + "," + convert10to2FPart(DenormFloatPart);
                inNumber.CorrectResult2ccExp = Sign + convertToExp(convert10to2IPart(DenormIntPart) + "," + convert10to2FPart(DenormFloatPart));

                inNumber.Error = Sign + "0,0";
                */
            }
            catch (Exception ex)
            {
                throw new FCCoreFunctionException("Func 'calcResForInf' = [ " + ex.Message + " ]");
            }
        }
        private static PBNumber[] exponentsAlign(PBNumber opA, PBNumber opB)
        {
            switch (tCMP(opA.Exponent, opB.Exponent)) // Exponent align
            {
                case 1:
                    opB = ExponentAlign(opA, opB);
                    break;
                case -1:
                    opA = ExponentAlign(opB, opA);
                    break;
                case 0:
                default:
                    break;
            }

            PBNumber[] result = { opA, opB };
            return result;
        }
        public void calcResForDenorm(PBNumber inNumber, int precision)
        {
            String[] tempArray;
            String Sign;
            String E, M;
            String CorrectResult, CorrectResult2cc;
            int Offset = (int)inNumber.Offset;
            try
            {
                E = inNumber.Exponent;
                M = inNumber.Mantissa;
                tempArray = new String[Math.Abs(Offset) + 1];
                for (int i = 1; i <= Offset; i++)
                    tempArray[i] = "0";
                M = String.Join("", tempArray) + M;

                /* Sign */
                Sign = inNumber.Sign;
                /*if ((z == 0) || (NumberFormat == 0))
                    Sign = SignCharacterLeft;
                else
                    Sign = SignCharacterRight;
                */
                IPBNumber.NumberFormat NumberFormat = IPBNumber.NumberFormat.INTEGER;
                switch (NumberFormat)
                {
                    case IPBNumber.NumberFormat.INTEGER:
                        CorrectResult = Sign + "0," + convert2to10FPart(M, precision);
                        CorrectResult2cc = Sign + "0," + M;
                        break;
                    /*
                     * case 1:
                        if (z == 0)
                        {
                            inNumber.CorrectResultFractionL = Sign + "0," + convert2to10FPart(M, precision);
                            inNumber.CorrectResultFraction2ccL = Sign + "0," + M;
                        }
                        else
                        {
                            inNumber.CorrectResultFractionR = Sign + "0," + convert2to10FPart(M, precision);
                            inNumber.CorrectResultFraction2ccR = Sign + "0," + M;
                        }
                        break;
                    case 2:
                        if (z == 0)
                        {
                            inNumber.CorrectResultIntervalL = Sign + "0," + convert2to10FPart(M, precision);
                            inNumber.CorrectResultInterval2ccL = Sign + "0," + M;
                        }
                        else
                        {
                            inNumber.CorrectResultIntervalR = Sign + "0," + convert2to10FPart(M, precision);
                            inNumber.CorrectResultInterval2ccR = Sign + "0," + M;
                        }
                        break;
                     */
                }
            }
            catch (Exception ex)
            {
                throw new FCCoreFunctionException("Func 'calcResForDenorm' = [ " + ex.Message + " ]");
            }
        }
        private void pBNumberToolStripMenuItem_Click(object sender, EventArgs e)
        {
            rTBLog.Text += "\n\r _________PBNumer TESTING BEGIN";
                String testNumber = "-10000000,1379999e-1055";
                PBNumber pbNumber1 = new PBNumber(testNumber, IPBNumber.NumberCapacity.PB256, IPBNumber.RoundingType.POST_BINARY);
                PBNumber pbNumber2 = new PBNumber(testNumber, IPBNumber.NumberCapacity.PB256, IPBNumber.RoundingType.ZERO);
                PBNumber pbNumber3 = new PBNumber(testNumber, IPBNumber.NumberCapacity.PB256, IPBNumber.RoundingType.NEGATIVE_INFINITY);
                PBNumber pbNumber4 = new PBNumber(testNumber, IPBNumber.NumberCapacity.PB256, IPBNumber.RoundingType.POSITIVE_INFINITY);
                PBNumber pbNumber5 = new PBNumber(testNumber, IPBNumber.NumberCapacity.PB256, IPBNumber.RoundingType.NEAR_INTEGER);

                String test1 = pbNumber1.toDigit(30, true);
                rTBLog.Text += "PB " + test1 + "\r\n";

                test1 = pbNumber2.toDigit(30, true);
                rTBLog.Text += "ZERO " + test1 + "\r\n";

                test1 = pbNumber3.toDigit(30, true);
                rTBLog.Text += "NInf " + test1 + "\r\n";

                test1 = pbNumber4.toDigit(30, true);
                rTBLog.Text += "PInf " + test1 + "\r\n";

                test1 = pbNumber5.toDigit(30, true);
                rTBLog.Text += "NInt " + test1 + "\r\n";
                rTBLog.Text += "\n\r _________PBNumer TESTING END";
        }
 /// <summary>
 /// Postbinary numeric substraction
 /// </summary>
 /// <param name="leftOperand"></param>
 /// <param name="rightOperand"></param>
 /// <returns></returns>
 public PBNumber pSUB(PBNumber leftOperand, PBNumber rightOperand)
 {
     return null;
 }
 public Command(String inOperation, int inLeftOperandFromMemory, String inRightOperand)
 {
     this.Code = getOperationCode(inOperation);
         this.rightOperand = new PBNumber(inRightOperand, IPBNumber.NumberCapacity.PB128, IPBNumber.RoundingType.POST_BINARY);
         this.MemoryCellNeeded = inLeftOperandFromMemory;
 }
 public MemoryCell()
 {
     MemoryCellValue = null;
     CanBeErased = false;
     valueSet = false;
 }
        public void calcResForNan(PBNumber inNumber)
        {
            try
            {
                /*
                if (NumberFormat == 0)
                {
                    inNumber.CorrectResult = "Невозможно представить в данном формате";
                    inNumber.CorrectResultExp = "Невозможно представить в данном формате";
                    inNumber.CorrectResult2cc = "Невозможно представить в данном формате";
                    inNumber.CorrectResult2ccExp = "Невозможно представить в данном формате";
                    inNumber.Error = "Невозможно представить в данном формате";
                }

                if (cycle == 2 && NumberFormat == 1)
                {
                    if (z == 0)
                    {
                        inNumber.CorrectResultFractionL = "Невозможно представить в данном формате";
                        inNumber.CorrectResultFractionExpL = "Невозможно представить в данном формате";
                        inNumber.CorrectResultFraction2ccL = "Невозможно представить в данном формате";
                        inNumber.CorrectResultFraction2ccExpL = "Невозможно представить в данном формате";
                        inNumber.ErrorFractionLeft = "Невозможно представить в данном формате";
                    }
                    if (z == 1)
                    {
                        inNumber.CorrectResultFractionR = "Невозможно представить в данном формате";
                        inNumber.CorrectResultFractionExpR = "Невозможно представить в данном формате";
                        inNumber.CorrectResultFraction2ccR = "Невозможно представить в данном формате";
                        inNumber.CorrectResultFraction2ccExpR = "Невозможно представить в данном формате";
                        inNumber.ErrorFractionRight = "Невозможно представить в данном формате";
                    }
                }

                if (cycle == 2 && NumberFormat == 2)
                {
                    if (z == 0)
                    {
                        inNumber.CorrectResultIntervalL = "Невозможно представить в данном формате";
                        inNumber.CorrectResultIntervalExpL = "Невозможно представить в данном формате";
                        inNumber.CorrectResultInterval2ccL = "Невозможно представить в данном формате";
                        inNumber.CorrectResultInterval2ccExpL = "Невозможно представить в данном формате";
                        inNumber.ErrorIntervalLeft = "Невозможно представить в данном формате";
                    }
                    if (z == 1)
                    {
                        inNumber.CorrectResultIntervalR = "Невозможно представить в данном формате";
                        inNumber.CorrectResultIntervalExpR = "Невозможно представить в данном формате";
                        inNumber.CorrectResultInterval2ccR = "Невозможно представить в данном формате";
                        inNumber.CorrectResultInterval2ccExpR = "Невозможно представить в данном формате";
                        inNumber.ErrorIntervalRight = "Невозможно представить в данном формате";
                    }
                }*/
            }
            catch (Exception ex)
            {
                throw new FCCoreFunctionException("Func 'calcResForNan' = [ " + ex.Message + " ]");
            }
        }
        public void calcResForZero(PBNumber inNumber)
        {
            try
            {
                /*
                String Sign;
                switch (inNumber.Name)
                {
                    case "Num32":
                        Num32.Exponenta = "00000000";
                        Num32.Mantisa = "000000000000000000000"; // 21
                        break;
                    case "Num64":
                        if (z == 0)
                        {
                            Num64.Exponenta = Format == 0 ? "00000000000" : "00000000";
                            Num64.Mantisa = Format == 0 ? "000000000000000000000000000000000000000000000000" : "000000000000000000000"; // 48 - 21
                        }
                        else
                        {
                            Num64.ExponentaRight = Format == 0 ? "00000000000" : "00000000";
                            Num64.MantisaRight = Format == 0 ? "000000000000000000000000000000000000000000000000" : "000000000000000000000"; // 48 - 21
                        }
                        break;
                    case "Num128":
                        if (z == 0)
                        {
                            Num128.Exponenta = Format == 0 ? "000000000000000" : "00000000000";
                            Num128.Mantisa = Format == 0 ? "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" : "000000000000000000000000000000000000000000000000";  // 104 - 48
                        }
                        else
                        {
                            Num128.ExponentaRight = Format == 0 ? "000000000000000" : "00000000000";
                            Num128.MantisaRight = Format == 0 ? "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" : "000000000000000000000000000000000000000000000000";  // 104 - 48
                        }
                        break;
                    case "Num256":
                        if (z == 0)
                        {
                            Num256.Exponenta = Format == 0 ? "00000000000000000000" : "000000000000000";
                            Num256.Mantisa = Format == 0 ? "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; // 219 - 104
                        }
                        else
                        {
                            Num256.ExponentaRight = Format == 0 ? "00000000000000000000" : "000000000000000";
                            Num256.MantisaRight = Format == 0 ? "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; // 219 - 104
                        }
                        break;
                }

                /* Sign */
                /* if ((z == 0) || (NumberFormat == 0))
                     Sign = SignCharacterLeft;
                 else
                     Sign = SignCharacterRight;

                 if (NumberFormat == 0)
                 {
                     inNumber.CorrectResult = Sign + "0,0";
                     inNumber.CorrectResultExp = Sign + "0,0";
                     inNumber.CorrectResult2cc = Sign + "0,0";
                     inNumber.CorrectResult2ccExp = Sign + "0,0";
                     inNumber.Error = Sign + "0,0";
                 }

                 if (cycle == 2 && NumberFormat == 1)
                 {
                     if (z == 0)
                     {
                         inNumber.CorrectResultFractionL = Sign + "0,0";
                         inNumber.CorrectResultFractionExpL = Sign + "0,0";
                         inNumber.CorrectResultFraction2ccL = Sign + "0,0";
                         inNumber.CorrectResultFraction2ccExpL = Sign + "0,0";
                         inNumber.ErrorFractionLeft = Sign + "0,0";
                     }
                     if (z == 1)
                     {
                         inNumber.CorrectResultFractionR = Sign + "0,0";
                         inNumber.CorrectResultFractionExpR = Sign + "0,0";
                         inNumber.CorrectResultFraction2ccR = Sign + "0,0";
                         inNumber.CorrectResultFraction2ccExpR = Sign + "0,0";
                         inNumber.ErrorIntervalRight = Sign + "0,0";
                     }
                 }

                 if (cycle == 2 && NumberFormat == 2)
                 {
                     if (z == 0)
                     {
                         inNumber.CorrectResultIntervalL = Sign + "0,0";
                         inNumber.CorrectResultIntervalExpL = Sign + "0,0";
                         inNumber.CorrectResultInterval2ccL = Sign + "0,0";
                         inNumber.CorrectResultInterval2ccExpL = Sign + "0,0";
                         inNumber.ErrorIntervalLeft = Sign + "0,0";
                     }
                     if (z == 1)
                     {
                         inNumber.CorrectResultIntervalR = Sign + "0,0";
                         inNumber.CorrectResultIntervalExpR = Sign + "0,0";
                         inNumber.CorrectResultInterval2ccR = Sign + "0,0";
                         inNumber.CorrectResultInterval2ccExpR = Sign + "0,0";
                         inNumber.ErrorIntervalRight = Sign + "0,0";
                     }
                 }*/
            }
            catch (Exception ex)
            {
                throw new FCCoreFunctionException("Func 'calcResForZero' = [ " + ex.Message + " ]");
            }
        }
 private void srzToolStripMenuItem_Click(object sender, EventArgs e)
 {
     PBNumber A = new PBNumber("1", IPBNumber.NumberCapacity.PB64, IPBNumber.RoundingType.POST_BINARY);
       PBNumber B = new PBNumber("1", IPBNumber.NumberCapacity.PB64, IPBNumber.RoundingType.POST_BINARY);
       PBNumber C = new PBNumber("0", IPBNumber.NumberCapacity.PB64, IPBNumber.RoundingType.POST_BINARY);
       C = PBMath.pMUL(A, B);
       Console.WriteLine("A+B=C="+C.toDigit());
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="leftOperand"></param>
 /// <param name="rightOperand"></param>
 /// <returns></returns>
 private PBNumber SUB(PBNumber leftOperand, PBNumber rightOperand)
 {
     return ADD(leftOperand, rightOperand);
 }
        /// <summary>
        /// Postbinary numeric addition
        /// </summary>
        /// <param name="leftOperand">Left operand of operation.</param>
        /// <param name="rightOperand">Right operand of operation.</param>
        /// <returns>Result of operation</returns>
        private PBNumber ADD(PBNumber leftOperand, PBNumber rightOperand)
        {
            PBNumber opA = (PBNumber)leftOperand.Clone();
            PBNumber opB = (PBNumber)rightOperand.Clone();
            PBNumber opC = new PBNumber("0", IPBNumber.NumberCapacity.PB128, IPBNumber.RoundingType.POST_BINARY);

            String iuA = "";
            String iuB = "";

            switch (tCMP(opA.Exponent, opB.Exponent)) // Exponent align
                {
                    case 1:
                        opB = ExponentAlign(opA, opB);
                        // log here A, B
                        iuA = "1";
                        iuB = "";
                        break;
                    case -1:
                        opA = ExponentAlign(opB, opA);
                        // log here A, B
                        iuA = "";
                        iuB = "1";
                        break;
                    case 0:
                    default:
                        // log here A, B
                        break;
                }

            PBConvertion pbconvertion = new PBConvertion();
            int a = Int32.Parse(pbconvertion.convert2to10IPart(opA.Exponent));

            String str = tADD(iuA + opA.Mantissa, iuB + opB.Mantissa, false);
            int iuPosition = str.IndexOf('1');
            a -= iuPosition;
            str = str.Substring(iuPosition);

            opC.Mantissa = str.Substring(1);

            opC.Exponent = pbconvertion.convert10to2IPart(a.ToString());
            // log here C
            return opC;
        }
 /// <summary>
 /// Shifts PBNumber number with regard to shiftValue sign(shift direction) and modulus(counts of shifts).
 /// </summary>
 /// <param name="operand">PBNumber to shift.</param>
 /// <param name="shiftValue">Sign shows direction of shift; Modulus shows counts of shifts.</param>
 /// <returns>Shifted PBNumber</returns>
 public static PBNumber Shift(PBNumber operand, int shiftValue)
 {
     PBConvertion pbconvertion = new PBConvertion();
     int expA = Int32.Parse(pbconvertion.convert2to10IPart(operand.Exponent));
     expA += shiftValue;
     IPBNumber.IFPartsOfNumber ipbn = new IPBNumber.IFPartsOfNumber();
     if (shiftValue != 0)
     {
         if (shiftValue > 0)
         {
             String newMantissa = AddSymbols("0", "1" + operand.Mantissa, shiftValue - 1, true);
             operand.Mantissa = newMantissa;
         }
         else
         {
             String precipitated = operand.Mantissa.Substring(operand.Mantissa.Length + shiftValue);
             operand.Mantissa = AddSymbols("0", operand.Mantissa, Math.Abs(shiftValue), true);
             if (precipitated.Length >= 1)
             {
                 operand.Round(IPBNumber.RoundingType.POST_BINARY, operand.Mantissa, 104, ipbn, 0, IPBNumber.NumberCapacity.PB128);
             }
         }
     }
     operand.Exponent = pbconvertion.convert10to2IPart(expA.ToString());
     return operand;
 }
        private void tetraMathToolStripMenuItem_Click(object sender, EventArgs e)
        {
            rTBLog.Text += "\n\r _________TETRA MATH TESTING BEGIN";
                String testNumber = "-10000000,1379999e-1055";
                PBNumber pbNumber1 = new PBNumber(testNumber, IPBNumber.NumberCapacity.PB256, IPBNumber.RoundingType.POST_BINARY);
                PBNumber pbNumber2 = new PBNumber(testNumber, IPBNumber.NumberCapacity.PB256, IPBNumber.RoundingType.ZERO);
                PBNumber pbNumber3 = new PBNumber(testNumber, IPBNumber.NumberCapacity.PB256, IPBNumber.RoundingType.NEGATIVE_INFINITY);
                PBNumber pbNumber4 = new PBNumber(testNumber, IPBNumber.NumberCapacity.PB256, IPBNumber.RoundingType.POSITIVE_INFINITY);
                PBNumber pbNumber5 = new PBNumber(testNumber, IPBNumber.NumberCapacity.PB256, IPBNumber.RoundingType.NEAR_INTEGER);

                PBConvertion pbc = new PBConvertion();
                PBMath pbmath = new PBMath();
                pbNumber3 = pbmath.pADD(pbNumber1, pbNumber2);

                String test1 = pbmath.pCMP(pbNumber1, pbNumber1).ToString();
                String test2 = pbmath.pCMP(pbNumber1, pbNumber2).ToString();
                String test3 = pbmath.pCMP(pbNumber2, pbNumber1).ToString();

                rTBLog.Text += "\r\n" + test1;
                rTBLog.Text += "\r\n" + test2;
                rTBLog.Text += "\r\n" + test3;
                rTBLog.Text += "\n\r _________TETRA MATH TESTING END";
        }
        /// <summary>
        /// Function converts postbinary normilized number to number in 10cc
        /// </summary>
        /// <param name="inNumber">PostBinary number.</param>
        /// <param name="precision"></param>
        public String calcResForNorm(PBNumber inNumber, int precision)
        {
            String binIPartOut, binFPartOut, Sign;
            String[] tempArray;
            String M, E;
            String CorrectResult = "", CorrectResult2cc;
            try
            {
                E = inNumber.Exponent;
                M = inNumber.Mantissa;

                M = "1" + M;
                E = convert2to10IPart(E);
                int iE = int.Parse(E) - (int)inNumber.Offset;
                if (iE > M.Length)
                {
                    tempArray = new String[Math.Abs(iE) + 1];
                    for (int i = 0; i <= iE; i++)
                        tempArray[i] = "0";
                    M = M + String.Join("", tempArray);

                }
                if (iE >= 0)
                {
                    if (iE + 1 <= M.Length)
                    {
                        binIPartOut = M.Substring(0, iE + 1);
                        //binFPartOut = "0" + M.Substring(iE + 1);
                        binFPartOut = M.Substring(iE + 1);
                    }
                    else
                    {
                        int temp = M.Length;
                        binIPartOut = M.Substring(0, temp);
                        binFPartOut = M.Substring(temp);
                    }
                }
                else
                {
                    // After Research
                    int max = 0;
                    tempArray = new String[Math.Abs(iE) + 1];
                    for (int i = 1; i < Math.Abs(iE); i++) //for (int i = -1; i > iE; i--)
                    {
                        tempArray[max] = "0";
                        max++;
                    }
                    if (max > 0)
                        M = String.Join("", tempArray) + M;
                    //else
                    //    M = "0" + M;

                    binIPartOut = "0";
                    binFPartOut = M;
                }

                /* Sign */
                Sign = inNumber.Sign;

                if (binFPartOut.IndexOf('M') == -1)
                {
                    return deleteNonSignificantBits((Sign == "1" ? "-" : "") + convert2to10IPart(binIPartOut) + "," + convert2to10FPart(binFPartOut, precision));
                    //CorrectResult2cc = Sign + binIPartOut + "," + binFPartOut;
                }else
                {
                    // split binary float part to 2 parts //  ex. 0101m1 -> [010101:010111]
                    String lowBound = binFPartOut.Replace('M', '0').Replace('A', '1');
                    String highBound = binFPartOut.Replace('M', '1').Replace('A', '0');
                    String iPart = convert2to10IPart(binIPartOut);
                    CorrectResult = deleteNonSignificantBits((Sign == "1" ? "-" : "") + iPart + "," + convert2to10FPart(lowBound, precision));
                    CorrectResult += ':' + deleteNonSignificantBits((Sign == "1" ? "-" : "") + iPart + "," + convert2to10FPart(highBound, precision));
                    return CorrectResult;
                }
            }
            catch (Exception ex)
            {
                throw new FCCoreFunctionException("Func 'calcResForNorm' = [ " + ex.Message + " ]");
            }

            //CorrectResult = deleteNonSignificantBits(CorrectResult);
            //return CorrectResult;
        }
 /// <summary>
 /// Postbinary numeric negative
 /// </summary>
 /// <param name="operand"></param>
 /// <returns></returns>
 public PBNumber NEG(PBNumber operand)
 {
     operand.Sign = operand.Sign == "0" ? "1" : "0";
     return operand;
 }
 public Command(String inOperation, String inLeftOperand, String inRightOperand)
 {
     switch (inOperation)
         {
             case "+": this.Code = 1; break;
             case "-": this.Code = 2; break;
             case "*": this.Code = 3; break;
             case "/": this.Code = 4; break;
             // Exponent need to be checked in Parser.cs
             case "^": this.Code = 5; break;
             default: break;
         }
         this.leftOperand = new PBNumber(inLeftOperand, IPBNumber.NumberCapacity.PB128, IPBNumber.RoundingType.POST_BINARY);
         this.rightOperand = new PBNumber(inRightOperand, IPBNumber.NumberCapacity.PB128, IPBNumber.RoundingType.POST_BINARY);
 }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="leftOperand"></param>
        /// <param name="rightOperand"></param>
        /// <returns></returns>
        public PBNumber pADD(PBNumber leftOperand, PBNumber rightOperand)
        {
            //if (pCMP(leftOperand, rightOperand))
            if (leftOperand.Sign != rightOperand.Sign)
            {

            }
            else
            {
                return ADD(leftOperand, rightOperand);
            }

            return ADD(leftOperand, rightOperand);
        }
        public Command(String inOperation, int inLeftOperandFromMemory, int inRightOperandFromMemory)
        {
            this.Code = getOperationCode(inOperation);

                this.leftOperand = null;
                this.rightOperand = null;

                this.MemoryCellNeededExtra = inRightOperandFromMemory;
                this.MemoryCellNeeded = inLeftOperandFromMemory;
        }
 /// <summary>
 /// </summary>
 /// <param name="leftOperand"></param>
 /// <param name="rightOperand"></param>
 /// <returns></returns>
 //TODO: add exponent align
 public PBNumber pAND(PBNumber leftOperand, PBNumber rightOperand)
 {
     PBNumber opA = (PBNumber)leftOperand.Clone();
     PBNumber opB = (PBNumber)rightOperand.Clone();
     String result = "";
     for (int i = 0; i < 10; i++)//change 10 to Mantissa lenght
     {
         switch (opA.Mantissa[i])
         {
             case '0':
                 {
                     result += '0';
                     break;
                 }
             case '1':
                 {
                     result += '1';
                     break;
                 }
             case 'A':
                 {
                     switch (opB.Mantissa[i])
                     {
                         case '0':
                             {
                                 result += '0';
                                 break;
                             }
                         case '1':
                             {
                                 result += 'A';
                                 break;
                             }
                         case 'A':
                             {
                                 result += 'A';
                                 break;
                             }
                         case 'M':
                             {
                                 result += 'M';
                                 break;
                             }
                     }
                     break;
                 }
             case 'M':
                 {
                     switch (opB.Mantissa[i])
                     {
                         case '0':
                             {
                                 result += '0';
                                 break;
                             }
                         case '1':
                             {
                                 result += 'M';
                                 break;
                             }
                         case 'A':
                             {
                                 result += 'M';
                                 break;
                             }
                         case 'M':
                             {
                                 result += 'M';
                                 break;
                             }
                     }
                     break;
                 }
         }
     }
     return null;
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="leftOperand"></param>
 /// <param name="rightOperand"></param>
 /// <returns></returns>
 public int pCMP(PBNumber leftOperand, PBNumber rightOperand)
 {
     if (leftOperand.Sign != rightOperand.Sign)
     {
         return (leftOperand.Sign == "0") ? 1 : -1;
     }
     else
     {
         int cmpExponent = tCMP(leftOperand.Exponent, rightOperand.Exponent);
         if (cmpExponent != 0)
         {
             return cmpExponent;
         }
         else
         {
             return tCMP(leftOperand.Mantissa, rightOperand.Mantissa);
         }
     }
 }
        public static void CreatePBNumber()
        {
            String testNumber = "123.123";

            PBNumber pbNUmber = new PBNumber(testNumber, NumberCapacity.PB128, RoundingType.NEAR_INTEGER);
        }