MÉTODOS NUMÉRICOS CONJUNTO DE NÚMEROS DE PUNTO FLOTANTE (GENERACIÓN DE MANTISAS) Luís Roberto Olascoaga Surmay Universidad de Córdoba Facultad de Ciencias Básicas e Ingenierías Departamento de Ingeniería de Sistemas y Telecomunicaciones
CURSO: Métodos Numéricos TEMA: Conjunto de números de punto flotante (Generación de mantisas) DESCRIPCION: Desarrollo practico del tema de la generación de mantisas para un conjunto de números de punto flotante, del cual conocemos los valores de su precisión t, base (que para el caso asumimos que es la base binaria) y rango de valores que tomaran los exponentes de l (valor mas pequeño) hasta u (valor más alto). OBJETIVO: Diseñar e implementar en lazarus una clase para generar el conjunto de mantisas en forma binaria para un conjunto de números de punto flotante considerando los datos de la precisión y rango de exponentes del mismo. PALABRAS CLAVES: Formatos de números reales conversión de números decimales a binario, conjunto de números de punto flotante, mantisas, números racionales, programación orientada a objetos, diseño de clases, implementación con eventos. AUTOR: Lic. Luis Olascoaga Surmay DESARROLLO: A continuación se presenta la implementación práctica del tema de la generación de las mantisas para un conjunto de números de punto flotante del cual conocemos como entrada sus datos característicos fundamentales. Estudie la teoría expuesta en clase y luego analice el código presentado para encenderlo adecuadamente, a continuación construya el proyecto correspondiente en lazarus, pase el código, diseñe la ventana como se indica al final y haga la programación de los eventos correspondientes.
unit umantisas; {$mode objfpc}{$h+} interface uses Classes, SysUtils, Math; type { TMantisa } TMantisa = class private Precision:Integer; MinExpo:Integer; MaxExpo:Integer; public constructor Create; procedure SetPrecision(Pre:Integer); procedure SetMinExpo(Min:Integer); procedure SetMaxExpo(Max:Integer); function GetPrecision:Integer; function GetMinExpo:Integer; function GetMaxExpo:Integer; function NumMantisas:integer; function Rellenar(Bin:string):string; function Potencia(Expo:Integer):longint; function BinMantisa(Num:Integer):string; function FormarMantisa(BinMan:string):string; procedure SumarFrac(a,b:Integer;var c,d:integer); function Expandir(BinMan:string):string ; implementation { TMantisa } constructor TMantisa.Create; Precision:=0; MinExpo:=0; MaxExpo:=0; procedure TMantisa.SetPrecision(Pre: Integer); Precision:=Pre; procedure TMantisa.SetMinExpo(Min: Integer); MinExpo:=Min;
procedure TMantisa.SetMaxExpo(Max: Integer); MaxExpo:=Max; function TMantisa.GetPrecision: Integer; result:=precision; function TMantisa.GetMinExpo: Integer; result:=minexpo; function TMantisa.GetMaxExpo: Integer; result:=maxexpo; function TMantisa.Potencia(Expo: Integer): longint; result:=trunc(power(2,expo)); function TMantisa.NumMantisas: integer; result:=potencia(precision 1); function TMantisa.Rellenar(Bin: string): string; while Length(Bin)<Precision do Bin:='0' + Bin; result:=bin; function TMantisa.BinMantisa(Num: Integer): string; result:=''; repeat if Num mod 2 = 0 then result:='0' + result else result:='1' + result; Num:=Num div 2; until Num=0; function TMantisa.FormarMantisa(BinMan: string): string; result:='(.' + BinMan + ')';
procedure TMantisa.SumarFrac(a, b: Integer; var c, d: Integer); var Mcd,tem:Integer; if b>d then mcd:=b else mcd:=d; tem:=a*(mcd div b) + c*(mcd div d); c:=tem; d:=mcd; function TMantisa.Expandir(BinMan: string): string; var i,num,den,a,b:integer; a:=0; b:=1; result:=''; for i:=1 to Length(BinMan)do if BinMan[i]='1' then num:=1 else num:=0; den:=potencia(i); result:=result + BinMan[i] +'/'+ IntToStr(Den) + ' + '; SumarFrac(num,den,a,b); result:=copy(result,1,length(result) 2); result:=result + ' = ' + IntToStr(a) + '/' + IntToStr(b); end.
El diseño para la ventana es el siguiente: El código para el evento click del botón generar es el siguiente: //Evento click boton generar procedure TForm1.Button1Click(Sender: TObject); var Tem:string; i,min:integer; Man:TMantisa; M1.Clear; Man:=TMantisa.Create; Man.SetPrecision(StrToInt(E1.Text)); Man.SetMinExpo(StrToInt(E2.Text)); Man.SetMaxExpo(StrToInt(E3.Text)); Min:=Man.NumMantisas; for i:=min to 2*min 1 do Tem:=Man.BinMantisa(i); M1.Lines.Add(' '+ Man.FormarMantisa(Tem) + ' = ' + Man.Expandir(Tem)); Man.Free;
Pruebe la aplicación con las entradas indicadas en la siguiente pantalla: