// 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)); }
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; } }