[Back to MATH SWAG index] [Back to Main SWAG index] [Original]

    Type Fijo=Record                {estructura de un nß de coma fija}
                Mantisa,
                Decimal:Integer
              End;

    Var Var1,                       {variables de ejemplo}
        Var2:Fijo;

    Const Decimal_Max=100;            {2 decimales}
          Decimal_Stellen=2;

    Function Strg(NumF:Fijo):String;
    {convierte un nß de coma fija en una cadena}
    Var Decimal_Str,                  {cadena para formar los decimales}
        Mantisa_Str:String;            {cadena para formar la mantisa}
        i:Word;
    Begin
      If NumF.Decimal < 0 Then       {parte decimal sin signo}
        NumF.Decimal:=-NumF.Decimal;
      Str(NumF.Decimal:Decimal_Stellen,Decimal_Str);
                                    {generar cadena decimal}
      For i:=0 to Decimal_Stellen do  {y sustituir blancos por 0en}
        If Decimal_Str[i] = ' ' Then Decimal_Str[i]:='0';
      Str(NumF.Mantisa,Mantisa_Str);     {generar cadena de mantisa}
      Strg:=Mantisa_Str+','+Decimal_Str; {componer cadena}
    End;

    Procedure Convert(RZahl:Real;Var NumF:Fijo);
    {convierta real RZahl en nß coma fija NumF}
    Begin
      NumF.Mantisa:=Trunc(RZahl);
        {determinar parte mantisa}
      NumF.Decimal:=Trunc(Round(Frac(RZahl)*Decimal_Max));
        {determinar parte decimal y guardar como nß entero}
    End;

    Procedure Adjust(Var NumF:Fijo);
    {devuelve el n£mero de coma fija en formato legal}
    Begin
      If NumF.Decimal > Decimal_Max Then Begin
        Dec(NumF.Decimal,Decimal_Max); {si parte decimal ha rebasado positivo}
        Inc(NumF.Mantisa);            {reponer y reducir mantisa}
      End;
      If NumF.Decimal < -Decimal_Max Then Begin
        Inc(NumF.Decimal,Decimal_Max); {si parte decimal ha rebasado negativo}
        Dec(NumF.Mantisa);            {reponer y aumentar mantisa}
      End;
    End;

    Procedure Add(Var Summe:Fijo;NumF1,NumF2:Fijo);
    {Suma NumF1 y NumF2 y deposita resultado en ab}
    Var Resultado:Fijo;
    Begin
      Resultado.Decimal:=NumF1.Decimal+NumF2.Decimal;
        {sumar parte decimal}
      Resultado.Mantisa:=NumF1.Mantisa+NumF2.Mantisa;
        {sumar mantisa}
      Adjust(Resultado);
        {pasar resultado a formato correcto}
      Summe:=Resultado;
    End;

    Procedure Sub(Var Diferencia:Fijo;NumF1,NumF2:Fijo);
    {resta NumF1 de NumF2 y deposita resultado en ab}
    Var Resultado:Fijo;
    Begin
      Resultado.Decimal:=NumF1.Decimal-NumF2.Decimal;
        {restar parte decimal}
      Resultado.Mantisa:=NumF1.Mantisa-NumF2.Mantisa;
        {restar mantisa}
      Adjust(Resultado);
        {pasar resultado a formato correcto}
      Diferencia:=Resultado;
    End;

    Procedure Mul(Var Producto:Fijo;NumF1,NumF2:Fijo);
    {multiplica NumF1 y NumF y deposita el resultado en ab}
    Var Resultado:LongInt;
    Begin
      Resultado:=Var1.Mantisa*Decimal_Max + Var1.Decimal;
        {formar primer factor}
      Resultado:=Resultado * (Var2.Mantisa*Decimal_Max + Var2.Decimal);
        {formar segundo factor}
      Resultado:=Resultado div Decimal_Max;
        {compensar factor aux. Decimal_Max}
      Producto.Mantisa:=Resultado div Decimal_Max;
        {extraer mantisa y parte decimal}
      Producto.Decimal:=Resultado mod Decimal_Max;
    End;

    Procedure Divi(Var Cociente:Fijo;NumF1,NumF2:Fijo);
    {divide NumF1 entre NumF2 y deposita el resultado en ab}
    Var Resultado:LongInt;           {resultado intermedio}
    Begin
      Resultado:=NumF1.Mantisa*Decimal_Max + NumF1.Decimal;
        {formar contador}
      Resultado:=Resultado * Decimal_Max div
    (NumF2.Mantisa*Decimal_Max+NumF2.Decimal);
        {dividir por el divisor, antes disponer de mÝs decimales}
      Cociente.Mantisa:=Resultado div Decimal_Max;
        {extraer parte decimal y mantisa}
      Cociente.Decimal:=Resultado mod Decimal_Max;
    End;

    Begin
      WriteLn;
      Convert(-10.2,Var1);          {cargar dos n£meros de demo}
      Convert(25.3,Var2);

      {cÝlculos propios para demostraci¢n:}

      Write(Strg(Var1),'*',Strg(Var2),'= ');
      Mul(Var1,Var1,Var2);
      WriteLn(Strg(Var1));

      Write(Strg(Var1),'-',Strg(Var2),'= ');
      Sub(Var1,Var1,Var2);
      WriteLn(Strg(Var1));

      Write(Strg(Var1),'/',Strg(Var2),'= ');
      Divi(Var1,Var1,Var2);
      WriteLn(Strg(Var1));

      Write(Strg(Var1),'+',Strg(Var2),'= ');
      Add(Var1,Var1,Var2);
      WriteLn(Strg(Var1));
    End.

[Back to MATH SWAG index] [Back to Main SWAG index] [Original]