예제 #1
0
        // arredontar binário somando 1 a mantissa
        public static string ArredondarBinario(string binario)
        {
            if ((binario[binario.Length - 1] == '1') && (binario[binario.Length - 2] == '1'))
            {
                bool[] Binario    = Conversores.StringParaBool(binario, 24);
                bool[] arredondar = new bool[24];
                bool   overflow   = false;

                arredondar[22] = true;
                Somador32Bit somador   = new Somador32Bit();
                bool[]       resultado = somador.Somador(Binario, arredondar, ref overflow, false);
                return(Conversores.BoolParaString(resultado).Substring(0, 23));
            }

            return(binario.Substring(0, 23));
        }
예제 #2
0
        public void Soma(float decimalA, float decimalB, bool soma, string sinal)
        {
            Somador32Bit somador32 = new Somador32Bit();
            Somador8Bit  somador8  = new Somador8Bit();



            bool overflow = false;

            bool[] A            = Conversores.PontoFlutuanteParaBinario(decimalA);
            string binarioA     = Conversores.BoolParaString(A);
            string hexaDecimalA = Conversores.BinarioParaHexa(binarioA);
            string sinalA       = ManipularBinario.ObterSinal1Bit(A);

            int    expoenteA     = Conversores.BinarioParaDecimal(ManipularBinario.ObterExpoente8bit(A), 8) - 127;
            string mantissaA     = ManipularBinario.ObterMantissa23bit(A);
            string expoenteFinal = "";
            int    deslocar      = 0;

            bool[] resultadoSomaMantisas = null;

            bool[] B            = Conversores.PontoFlutuanteParaBinario(decimalB);
            string binarioB     = Conversores.BoolParaString(B);
            string hexaDecimalB = Conversores.BinarioParaHexa(binarioB);
            string sinalB       = ManipularBinario.ObterSinal1Bit(B);
            int    expoenteB    = Conversores.BinarioParaDecimal(ManipularBinario.ObterExpoente8bit(B), 8) - 127;
            string mantissaB    = ManipularBinario.ObterMantissa23bit(B);

            // se os dois número forem iguais a zero
            if ((decimalA == decimalB) && (decimalA == 0))
            {
                textBoxResultadoNumero.Text = "0";
                textBoxSinalR.Text          = "0";
                textBoxExpoenteR.Text       = "00000000";
                textBoxMantissaR.Text       = "00000000000000000000000";
                textBoxHexa.Text            = "0x00000000";
            }
            else if (decimalA == 0)
            {
                textBoxResultadoNumero.Text = decimalB.ToString();
                textBoxSinalR.Text          = ManipularBinario.ObterSinal1Bit(B);
                textBoxExpoenteR.Text       = ManipularBinario.ObterExpoente8bit(B);
                textBoxMantissaR.Text       = ManipularBinario.ObterMantissa23bit(B);
                textBoxHexa.Text            = Conversores.BinarioParaHexa(binarioB);
            }
            else if (decimalB == 0)
            {
                textBoxResultadoNumero.Text = decimalA.ToString();
                textBoxSinalR.Text          = ManipularBinario.ObterSinal1Bit(A);
                textBoxExpoenteR.Text       = ManipularBinario.ObterExpoente8bit(A);
                textBoxMantissaR.Text       = ManipularBinario.ObterMantissa23bit(A);
                textBoxHexa.Text            = Conversores.BinarioParaHexa(binarioB);
            }
            else
            {
                mantissaA = ManipularBinario.Adicionar1(mantissaA);
                mantissaB = ManipularBinario.Adicionar1(mantissaB);

                if (expoenteB > expoenteA)
                {
                    expoenteFinal = ManipularBinario.ObterExpoente8bit(B);
                    deslocar      = Math.Abs(expoenteA - expoenteB);
                    mantissaA     = ManipularBinario.Deslocamento(mantissaA, deslocar);
                }
                else if (expoenteA > expoenteB)
                {
                    expoenteFinal = ManipularBinario.ObterExpoente8bit(A);
                    deslocar      = Math.Abs(expoenteB - expoenteA);
                    mantissaB     = ManipularBinario.Deslocamento(mantissaB, deslocar);
                }
                else if (expoenteA == expoenteB)
                {
                    expoenteFinal = ManipularBinario.ObterExpoente8bit(A);
                }

                if (soma == false)
                {
                    mantissaB = ManipularBinario.ComplementoDe2(mantissaB);
                }

                bool[] BinarioA = Conversores.StringParaBool(mantissaA, 24);
                bool[] BinarioB = Conversores.StringParaBool(mantissaB, 24);
                resultadoSomaMantisas = somador32.Somador(BinarioA, BinarioB, ref overflow, soma);

                string somaMantissas = Conversores.BoolParaString(resultadoSomaMantisas);
                //somaMantissas = ManipularBinario.AlinhaResultadoMantissa(somaMantissas);
                somaMantissas = ManipularBinario.Remover1(somaMantissas);

                if (overflow == true && soma == true)
                {
                    expoenteFinal = Conversores.BoolParaString(somador8.Somador(Conversores.StringParaBool(expoenteFinal, 8), Conversores.StringParaBool("00000001", 8), ref overflow));
                }
                else if (overflow == true && soma == false)
                {
                    //somaMantissas = ManipularBinario.NormalizarAposSoma(somaMantissas, ref expoenteFinal);
                }

                somaMantissas = ManipularBinario.ArredondarBinario(somaMantissas);

                string IEEE754_Binario = ManipularBinario.Gerar_IEEE754(sinal, expoenteFinal, somaMantissas);
                string IEEE754_Hexa    = Conversores.BinarioParaHexa(IEEE754_Binario);

                bool[] resultado = Conversores.StringParaBool(IEEE754_Binario, 32);

                sinal = ManipularBinario.ObterSinal1Bit(resultado);
                string expoente = ManipularBinario.ObterExpoente8bit(resultado);
                string mantissa = ManipularBinario.ObterMantissa23bit(resultado);

                textBoxResultadoNumero.Text = Conversores.BinarioFlutuanteParaDecimal(resultado).ToString();
                textBoxSinalR.Text          = sinal;
                textBoxExpoenteR.Text       = expoente;
                textBoxMantissaR.Text       = mantissa;
                textBoxHexa.Text            = IEEE754_Hexa;
            }
        }