/// <summary>
        /// Adds number to exponent.
        /// IMPORTANT- Doesn't count variety of formats (only Integer)
        /// </summary>
        /// <param name="inNumber"></param>
        /// <param name="inStr"></param>
        /// <param name="inCapacity"></param>
        public void sumExp(String Exponent, String inStr, IPBNumber.NumberCapacity inCapacity)
        {
            String E;
            int iE, Offset = 0;
            E = Exponent; // It can be Fraction or Interval

            Offset = (int)getNumberOffset(inCapacity);
            /*switch (inNumberFormat)
            {
                case 0: Offset = (int)inNumber.Offset; break;
                case 1:
                case 2: Offset = inNumber.OffsetFI; break;
                case 3: Offset = inNumber.OffsetTetra; break;
                case 4: Offset = inNumber.OffsetFITetra; break;
            }*/
            E = convert2to10IPart(E);
            iE = int.Parse(E) - Offset;
            // Check if inStr > E.Max

            iE += int.Parse(inStr); // This Addition is UNSECURE !
            // Check if iE > E.Max
            E = convert10to2IPart((iE + Offset).ToString());
            Exponent = E;
        }
        /// <summary>
        /// Denormolizes number
        /// </summary>
        /// <param name="dataString">Input String to dernomolize</param>
        /// <param name="NumberFormat">Indicates format of input number</param>
        /// <returns>Denormolized number as String</returns>
        public IPBNumber.IFPartsOfNumber DenormalizeNumber(String dataString, IPBNumber.NumberFormat inNumberFormat)
        {
            String denormNumber = "";
            String denormIntPart = "", denormFloatPart = "";
            String ExpSign, Sign = "0", SignCharacter = "+";
            String E;
            String[] tempArray;
            IPBNumber.IFPartsOfNumber returnValue = new IPBNumber.IFPartsOfNumber();
            try
            {
                ExpSign = dataString.Substring(dataString.IndexOf('e') + 1, 1);
                if (dataString[0] == '+')
                {
                    if (inNumberFormat == 0)
                    {
                        Sign = "0";
                        SignCharacter = "+";
                    }
                    else
                    {
                        /*
                        if (Left_Right == PartOfNumber.Left)
                        {
                            SignLeft = "0";
                            SignCharacterLeft = "+";
                        }
                        else
                        {
                            SignRight = "0";
                            SignCharacterRight = "+";
                        }*/
                    }
                }
                else
                    if (dataString[0] == '-')
                    {
                        if (inNumberFormat == 0)
                        {
                            Sign = "1";
                            SignCharacter = "-";
                        }
                        else
                        {
                            /*
                            if (Left_Right == PartOfNumber.Left)
                            {
                                SignLeft = "1";
                                SignCharacterLeft = "-";
                            }
                            else
                            {
                                SignRight = "1";
                                SignCharacterRight = "-";
                            }*/
                        }
                    }
                    else
                    {
                        if (inNumberFormat == 0)
                        {
                            Sign = "0";
                            SignCharacter = "+";
                        }
                        else
                        {
                            /*
                            if (Left_Right == PartOfNumber.Left)
                            {
                                SignLeft = "0";
                                SignCharacterLeft = "+";
                            }
                            else
                            {
                                SignRight = "0";
                                SignCharacterRight = "+";
                            }*/
                        }
                    }

                returnValue.Sign = Sign;

                //throw new Exception("Func [selectSEM]:= NoSignException.");

                int index = dataString.IndexOf('e') + 1;
                if (index < dataString.Length)
                    E = dataString.Substring(index, dataString.Length - index);
                else
                    throw new Exception("Func [selectSEM]:= NoExponentaException.");

                int iExp = Math.Abs(int.Parse(E));
                if ((dataString[0] == '-') || (dataString[0] == '+'))
                    dataString = dataString.Substring(1);
                /*iPart */
                denormIntPart = dataString.Substring(0, dataString.IndexOf(','));
                index = dataString.IndexOf(',') + 1;

                /*fPart*/
                denormFloatPart = dataString.Substring(index, dataString.IndexOf('e') - index);////+1
                if (ExpSign == "+")
                {
                    String fPartTemp = denormFloatPart;
                    if (iExp > 0)
                    {
                        tempArray = new String[Math.Abs(iExp - denormFloatPart.Length)];
                        for (int i = 0; i < (Math.Abs(iExp - denormFloatPart.Length)); i++)
                            tempArray[i] = "0";
                        fPartTemp = fPartTemp + String.Join("", tempArray);
                        denormFloatPart = "0";
                    }
                    denormIntPart = denormIntPart + fPartTemp.Substring(0, iExp);
                    denormFloatPart = fPartTemp.Substring(iExp);
                    if (denormFloatPart.Length == 0)
                        denormFloatPart = "0";
                }
                else
                {
                    String iPartTemp = denormIntPart;
                    tempArray = new String[Math.Abs(iExp - denormIntPart.Length)];
                    for (int i = 0; i < Math.Abs((iExp - denormIntPart.Length)); i++)
                        tempArray[i] = "0";
                    iPartTemp = String.Join("", tempArray) + iPartTemp;
                    if (iExp > denormIntPart.Length)
                    {
                        denormFloatPart = iPartTemp + denormFloatPart;
                        denormIntPart = "0";
                    }
                    else
                    {
                        denormFloatPart = iPartTemp.Substring(iPartTemp.Length - iExp) + denormFloatPart;
                        if (iPartTemp.Length != iExp)
                            denormIntPart = iPartTemp.Substring(0, iPartTemp.Length - iExp);
                        else
                            denormIntPart = "0";
                    }
                }
                // iPart = myUtil.deleteZeroFromNumber(iPart);
                // if (iPart[0] == '0')
                //    iPart = iPart.Substring(1);
                while ((denormIntPart[0] == '0') && (denormIntPart.Length > 1))
                {
                    denormIntPart = denormIntPart.Substring(1);
                }
                // Compact to one statement num32 = num64 = num128 = num256 = denorm

                denormNumber = SignCharacter + denormIntPart + "," + denormFloatPart;

                //Num32.Denormalized = Num64.Denormalized = Num128.Denormalized = Num256.Denormalized =
                if (inNumberFormat == 0)
                {
                    /*Num32.IntPartDenormalized = Num64.IntPartDenormalized = Num128.IntPartDenormalized = Num256.IntPartDenormalized = IntPartDenormalized = denormIntPart;
                    Num32.FloatPartDenormalized = Num64.FloatPartDenormalized = Num128.FloatPartDenormalized = Num256.FloatPartDenormalized = FloatPartDenormalized = denormFloatPart;*/
                    //DenormIntPart = denormIntPart;
                    returnValue.IntegerPart = denormIntPart;
                    //DenormFloatPart = denormFloatPart;
                    returnValue.FloatPart = denormFloatPart;
                }
                else
                {
                    /*
                    if (Left_Right == PartOfNumber.Left)
                    {
                        IntPartDenormalizedFILeft = denormIntPart;
                        FloatPartDenormalizedFILeft = denormFloatPart;
                    }
                    else
                    {
                        IntPartDenormalizedFIRight = denormIntPart;
                        FloatPartDenormalizedFIRight = denormFloatPart;
                    }
                    //Num32.IntPartDenormalizedFI = Num64.IntPartDenormalizedFI = Num128.IntPartDenormalizedFI = Num256.IntPartDenormalizedFI = IntPartDenormalizedFI = denormIntPart;
                    //Num32.FloatPartDenormalizedFI = Num64.FloatPartDenormalizedFI = Num128.FloatPartDenormalizedFI = Num256.FloatPartDenormalizedFI = FloatPartDenormalizedFI = denormFloatPart;
                    DenormIntPartFI = denormIntPart;
                    DenormFloatPartFI = denormFloatPart;
                    */
                }
                return returnValue;
            }
            catch (Exception ex)
            {
                //throw new FCCoreFunctionException("Exception in Func ['selectSEM'] Mess=[" + ex.Message + "]");
                throw new Exception(ex.Message, ex.InnerException);
            }
        }
 /// <summary>
 /// Calculates number offset depending on number capacity.
 /// IMPORTANT- Doesn't count variety of formats (only Integer)
 /// </summary>
 /// <param name="inCapacity"></param>
 /// <returns></returns>
 public IPBNumber.NumberOffset getNumberOffset(IPBNumber.NumberCapacity inCapacity)
 {
     switch (inCapacity)
     {
         case IPBNumber.NumberCapacity.PB32:
             {
                 return IPBNumber.NumberOffset.PB32;
             }
         case IPBNumber.NumberCapacity.PB64:
             {
                 return IPBNumber.NumberOffset.PB64;
             }
         case IPBNumber.NumberCapacity.PB128:
             {
                 return IPBNumber.NumberOffset.PB128;
             }
         case IPBNumber.NumberCapacity.PB256:
             {
                 return IPBNumber.NumberOffset.PB256;
             }
     }
     return IPBNumber.NumberOffset.PB128;
 }
        public String NormalizeNumber(String dataString, int inAccuracy, IPBNumber.NumberFormat inNumberFormat)
        {
            /// Current Number Sign 0 = '+'; 1 = '-'
            String Sign;
            try
            {
                if (dataString.Length > inAccuracy)
                    dataString = dataString.Substring(0, inAccuracy);

                if (dataString.Contains("E"))
                    dataString = dataString.Replace('E', 'e');
                //else
                // return null || Rise FCCoreException
                if (dataString.Contains("."))
                    dataString = dataString.Replace('.', ',');
                //else
                // return null || Rise FCCoreException

                if (dataString.IndexOf(',') == 0)
                    dataString = "0" + dataString;

                if ((dataString[0] != '-') && (dataString[0] != '+'))
                {
                    dataString = "+" + dataString;
                    if (inNumberFormat == 0)
                    {
                        Sign = "0";
                        //SignLeft = "0";
                    }
                    else
                    {
                        /** Reserved for float and interval formats
                        if (Left_Right == PartOfNumber.Left)
                            SignLeft = "0";
                        else
                            SignRight = "0";
                         */
                    }
                }
                else
                {
                    if (inNumberFormat == 0)
                    {
                        Sign = "0";

                        //SignLeft = "1";
                    }
                    else
                    {
                        /** Reserved for float and interval formats
                        if (Left_Right == PartOfNumber.Left)
                            SignLeft = "1";
                        else
                            SignRight = "1";
                         */
                    }
                }
                if (dataString.IndexOf(',') == -1)
                    if (dataString.IndexOf('e') != -1)
                        dataString = dataString.Substring(0, dataString.IndexOf('e')) + ",0" + dataString.Substring(dataString.IndexOf('e'));
                    else
                        dataString = dataString + ",0";

                if ((dataString[dataString.IndexOf('e') + 1] != '+') &&
                    (dataString[dataString.IndexOf('e') + 1] != '-'))
                    dataString = dataString.Replace("e", "e+");

                if (dataString.IndexOf('e') == -1)
                    dataString = dataString + "e+0";
            }
            catch (Exception ex)
            {
                throw new Exception("NormalizeNumber:" + ex.Message);
            }

            return dataString;
        }
 /// <summary>
 /// Calculates number mantissa length depending on number capacity.
 /// IMPORTANT- Doesn't count variety of formats (only Integer)
 /// </summary>
 /// <param name="inCapacity"></param>
 /// <returns></returns>
 public IPBNumber.NumberMantissaLength getNumberMantissaLength(IPBNumber.NumberCapacity inCapacity)
 {
     switch (inCapacity)
     {
         case IPBNumber.NumberCapacity.PB32:
             {
                 return IPBNumber.NumberMantissaLength.PB32;
             }
         case IPBNumber.NumberCapacity.PB64:
             {
                 return IPBNumber.NumberMantissaLength.PB64;
             }
         case IPBNumber.NumberCapacity.PB128:
             {
                 return IPBNumber.NumberMantissaLength.PB128;
             }
         case IPBNumber.NumberCapacity.PB256:
             {
                 return IPBNumber.NumberMantissaLength.PB256;
             }
     }
     return IPBNumber.NumberMantissaLength.PB128;
 }
 /// <summary>
 /// Gets empty mantissa depending on number capacity.
 /// </summary>
 /// <param name="inCapacity"></param>
 /// <returns></returns>
 public String getEmptyMantissa(IPBNumber.NumberCapacity inCapacity)
 {
     switch (inCapacity)
     {
         case IPBNumber.NumberCapacity.PB32:
             {
                 return IPBNumber.EmptyMantissa[(int)IPBNumber.NumberFormatCode.PB32];
             }
         case IPBNumber.NumberCapacity.PB64:
             {
                 return IPBNumber.EmptyMantissa[(int)IPBNumber.NumberFormatCode.PB64];
             }
         case IPBNumber.NumberCapacity.PB128:
             {
                 return IPBNumber.EmptyMantissa[(int)IPBNumber.NumberFormatCode.PB128];
             }
         case IPBNumber.NumberCapacity.PB256:
             {
                 return IPBNumber.EmptyMantissa[(int)IPBNumber.NumberFormatCode.PB256];
             }
     }
     return IPBNumber.EmptyMantissa[(int)IPBNumber.NumberFormatCode.PB128];
 }
Пример #7
0
        // PBNumber inObjectNumber,
        /// <summary>
        /// Calculates Mantissa for specified number. Define Exponent before Mantissa for correct running algorithm.
        /// Uses funcs: isStringZero,convert10to2IPart, checkStringFull, sumExp
        /// Uses Vars: Number.BinaryIntPart,Number.BinaryFloatPart
        /// </summary>
        /// <param name="inNumber">Number - var from which mantissa need to be taken</param>
        /// <param name="Left_Right">False - Left part og number, else - Right </param>
        /// <returns>Returns Mantissa in 2cc</returns>
        private void selectMantissa(IFPartsOfNumber inStringNumber, IPBNumber.NumberCapacity inCapacity, IPBNumber.NumberFormat inNumberFormat, IPBNumber.RoundingType inRoundingType)
        {
            int i, l = 0;
            int currMBits;
            String result = "";
            String[] tempArray;
            int offsetDot = 1;
            String bynaryStringInt = "", bynaryStringFloat = "";

            if (inNumberFormat == 0)
            {
                bynaryStringInt = inStringNumber.IntegerPart;
                bynaryStringFloat = inStringNumber.FloatPart;
            }

            try
            {
                if ((bynaryStringInt != null) && (bynaryStringFloat != null))
                {
                    if ((bynaryStringInt != "") && (bynaryStringFloat != ""))
                    {
                        if (bynaryStringInt.IndexOf('1') != -1)
                        {
                            offsetDot = bynaryStringInt.IndexOf('1');
                            result = bynaryStringInt.Substring(offsetDot + 1) + bynaryStringFloat;
                        }
                        else
                            if (bynaryStringFloat.IndexOf('1') != -1)
                                if (pbConvertion.isStringZero(Exponent))
                                    result = "" + bynaryStringFloat.Substring((int)pbConvertion.getNumberOffset(inCapacity) - 1, (int)pbConvertion.getNumberMantissaLength(inCapacity) + 1);
                                else
                                {
                                    offsetDot = bynaryStringFloat.IndexOf('1') + 1;
                                    result = "" + bynaryStringFloat.Substring(offsetDot);
                                }
                            else
                            {
                                currMBits = (int)pbConvertion.getNumberMantissaLength(inCapacity);
                                tempArray = new String[currMBits];
                                for (i = 0; i < currMBits; i++)
                                    tempArray[i] = "0";
                                result = result + String.Join("", tempArray);
                            }
                    }
                    else
                    {
                        throw new PBArithmeticException("Exception in Func ['selectMantissa'] Mess=[ Empty String - BynaryIntPart or BynaryFloatPart  ] ( PB" + inCapacity + "=" + inStringNumber.ToString() + ")");
                    }
                }
                else
                {
                    throw new PBArithmeticException("Exception in Func ['selectMantissa'] Mess=[ Null - BynaryIntPart or BynaryFloatPart ] ( PB" + inCapacity + "=" + inStringNumber.ToString() + ")");
                }

                currMBits = (int)pbConvertion.getNumberMantissaLength(inCapacity);

                if (result.Length <= (int)currMBits)
                {
                    // After Research Modification HERE NEEDED !
                    l = currMBits + 1 - result.Length;
                    tempArray = new String[l];
                    for (i = 0; i < l; i++)
                    {
                        tempArray[i] = "0";
                    }
                    result = result + String.Join("", tempArray);
                }
                Round(inRoundingType, result, currMBits, inStringNumber, offsetDot, inCapacity);

            }
            catch (Exception ex)
            {
                throw new PBFunctionException("Exception in Func ['selectMantissa'] Mess=[" + ex.Message + "]");
            }
        }
Пример #8
0
        //, PBNumber inObjectNumber
        /// <summary>
        /// Calculates Exponent for specified number
        /// Uses : Number.BinaryIntPart,Number.BinaryFloatPart
        /// </summary>
        /// <param name="inNumber">Number - var from which exponenta need to be taken</param>
        /// <param name="Left_Right">False - Left part og number, else - Right </param>
        /// <returns>Returns Exponent in 2cc</returns>
        private void selectExp(IFPartsOfNumber inStingNumber, IPBNumber.NumberCapacity inCapacity, IPBNumber.NumberFormat inNumberFormat)
        {
            int z = 0;
            int Offset = 0;
            String temp, result = "";
            String bynaryStringInt = "", bynaryStringFloat = "";
            bynaryStringInt = inStingNumber.IntegerPart;
            bynaryStringFloat = inStingNumber.FloatPart;

            try
            {
                Offset = (int)pbConvertion.getNumberOffset(inCapacity);

                if (bynaryStringInt.IndexOf('1') != -1)
                {
                    temp = bynaryStringInt;
                    temp = temp.TrimStart('0');
                    z = temp.Length - (temp.IndexOf('1') + 1);

                    if (z > Offset)
                        z = Offset;
                }
                else
                    if (bynaryStringFloat.IndexOf('1') != -1)
                    {
                        temp = bynaryStringFloat;
                        temp = temp.TrimEnd('0');
                        z = (temp.IndexOf('1') + 1);
                        z *= -1;
                        if (z < -Offset)
                            z = -Offset;
                    }
                    else
                    {
                        z = -Offset;
                    }

                result = pbConvertion.convert10to2IPart((z + Offset).ToString());
                this.Exponent = result;
            }
            catch (Exception ex)
            {
                throw new PBFunctionException("Exception in Func ['selectExp'] Mess=[" + ex.Message + "]");
            }
        }
Пример #9
0
        public void Round(IPBNumber.RoundingType inRoundingType, String result, int currMBits, IFPartsOfNumber inStringNumber, int offsetDot, IPBNumber.NumberCapacity inCapacity)
        {
            String M = "";

            switch (inRoundingType)
            {
                case IPBNumber.RoundingType.ZERO: // to ZERO
                    M = result.Substring(0, currMBits);
                    break;
                case IPBNumber.RoundingType.NEAR_INTEGER:// to INTEGER
                    if (pbConvertion.isStringZero(Exponent))
                    {
                        String[] tempArray = new String[offsetDot];
                        for (int i = 0; i < offsetDot; i++)
                            tempArray[i] = "0";
                        M = M + String.Join("", tempArray);

                        M += result.Substring(0, currMBits + 1 - offsetDot);
                    }
                    else
                        M = result.Substring(0, currMBits + 0);
                    if ((result[currMBits] == '1') && (inStringNumber.Sign[0] == '+'))
                    {
                        if (!pbConvertion.checkStringFull(M))
                        {
                            M = pbConvertion.convert2to10IPart(M);
                            M = pbConvertion.Addition(M, "1");
                        }
                        else
                        {
                            M = "0";
                            if (!pbConvertion.checkStringFull(Exponent))
                            {
                                pbConvertion.sumExp(Exponent, "1", inCapacity);
                            }
                        }
                        M = pbConvertion.convert10to2IPart(M);
                        if (M.Length + 1 == currMBits)
                        {
                            M = "0" + M;
                        }
                        else
                            if (M.Length < currMBits)
                            {
                                int l = currMBits - M.Length;
                                String[] tempArray = new String[l];
                                for (int i = 0; i < l; i++)
                                    tempArray[i] = "0";
                                M = String.Join("", tempArray) + M;
                            }
                    }
                    break;

                case IPBNumber.RoundingType.POSITIVE_INFINITY:// +Inf
                    M = result.Substring(0, currMBits);
                    if (inStringNumber.Sign[0] == '0')
                    {
                        if (!pbConvertion.checkStringFull(M))
                        {
                            M = pbConvertion.convert2to10IPart(M);
                            M = pbConvertion.Addition(M, "1");
                        }
                        else
                        {
                            M = "0";
                            if (!pbConvertion.checkStringFull(Exponent))
                            {
                                pbConvertion.sumExp(Exponent, "1", inCapacity);
                            }
                        }
                        M = pbConvertion.convert10to2IPart(M);
                    }
                    break;

                case IPBNumber.RoundingType.NEGATIVE_INFINITY:
                    // -Inf
                    M = result.Substring(0, currMBits);
                    if (inStringNumber.Sign[0] == '1')
                    {
                        if (!pbConvertion.checkStringFull(M))
                        {
                            M = pbConvertion.convert2to10IPart(M);
                            M = pbConvertion.Addition(M, "1");
                        }
                        else
                        {
                            M = "0";
                            if (!pbConvertion.checkStringFull(Exponent))
                            {
                                pbConvertion.sumExp(Exponent, "1", inCapacity);
                            }
                        }
                        M = pbConvertion.convert10to2IPart(M);
                    }
                    break;
                case IPBNumber.RoundingType.POST_BINARY:
                    if (result.Length >= currMBits)
                    {
                        M = result.Substring(0, currMBits);
                    }
                    else
                    {
                        M = result;
                        while (M.Length < currMBits)
                        {
                            M = "0" + M;
                        }
                    }

                    if (result.Length >= currMBits + 2)
                    {
                        String nonSignificantBits = result.Substring(currMBits, 2);
                        if ((nonSignificantBits == "01") || (nonSignificantBits == "10"))
                        {
                            int lastZero = M.LastIndexOf('0');
                            if (lastZero == -1)
                            {
                                if (nonSignificantBits == "10")
                                {
                                    M = pbConvertion.getEmptyMantissa(inCapacity).ToString();

                                    //TODO: Create function for addition in binary, and delete next 3th lines of code
                                    String tempExponent = pbConvertion.convert2to10IPart(this.Exponent);//
                                    tempExponent = pbConvertion.Addition(tempExponent, "1");            // ADD 1 to Exponent
                                    this.Exponent = pbConvertion.convert10to2IPart(tempExponent);       //
                                }
                            }
                            else
                            {
                                //TODO: Control here
                                M = M.Substring(0, lastZero) + "M";
                                while (M.Length < currMBits)
                                {
                                    M += "A";
                                }
                            }
                        }else
                            if (nonSignificantBits == "11")
                            {
                                if (M.LastIndexOf('0')!=-1)
                                {
                                   M = pbConvertion.convert10to2IPart( pbConvertion.Addition(pbConvertion.convert2to10IPart(M), "1") );
                                }else
                                {
                                    Round(IPBNumber.RoundingType.NEAR_INTEGER, result, currMBits, inStringNumber, offsetDot, inCapacity);
                                }
                            }
                    }
                    break;
            }
            this.Mantissa = M;
        }