home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / PROG / PASCAL / MISCTI10.ZIP / TI159.ASC < prev    next >
Encoding:
Text File  |  1988-06-02  |  4.3 KB  |  160 lines

  1. PRODUCT : TURBO PASCAL     NUMBER : 159
  2. VERSION : 2.0, 3.0
  3.      OS : PC-DOS, MS-DOS, CP/M-86
  4.    DATE : May 21, 1986
  5.  
  6.   TITLE : REAL FORMAT CONVERSION 
  7.  
  8. The  following  programs may be used to convert real number  data 
  9. format from that used by Turbo Pascal with 8087 support,  to  the 
  10. format used by regular Turbo Pascal,  and vice versa.   The first 
  11. program  converts  from 8087 to regular,  and the second  program 
  12. converts from regular to 8087.
  13.  
  14. Program IEEErealTOregular;
  15.      {  Converts an 8-byte,  IEEE real to Turbo  Pascal's  6-byte 
  16.         real format. }
  17. type
  18.   ieee       = array[1..8] of byte;
  19.   turbo_real = array[1..6] of byte;
  20.   mant       = array[1..5] of byte;
  21.   rf         = file of ieee;
  22.  
  23. var
  24.   f : rf;
  25.  
  26. procedure IEEEtoTurbo(long : ieee; var r : real);
  27.      { Convert from IEEE to Turbo Pascal's 6-byte real format }
  28. var
  29.   i : integer;
  30.   e : byte;
  31.   t : turbo_real absolute r;
  32.   sign : byte;
  33.  
  34. begin
  35.   { initialize variables }
  36.  
  37.   r := 0.0;
  38.   for i := 2 to 5 do
  39.     t[i] := 0;
  40.  
  41.   i := (long[8] and $7f) shl 4;       { get 7 highest bits of exponent }
  42.   i := i or ((long[7] and $f0) shr 4);{ get rest of exponent }
  43.  
  44.   if (i < 985) or (i > 1061) then     { check to make sure exponent }
  45.   begin                               { is in legal range }
  46.     writeln('exponent too large');
  47.     exit;
  48.   end;
  49.   i := i - 1023;                         { take out bias }
  50.   t[1] := i + $81;                       { put in new bias }
  51.   sign := long[8] and $80;               { get sign bit }
  52.  
  53.      { build up most significant byte }
  54.  
  55.   t[6] := sign + ((long[7] and $0f) shl 3) or ((long[6] and $e0) shr 5);
  56.  
  57.   {make rest of real number in groups of 5 and 3 }
  58.  
  59.   for i := 5 downto 2 do
  60.     t[i] := ((long[i+1] and $1f) shl 3) or ((long[i] and $e0) shr 5);
  61.  
  62. end;                                  { IEEEtoTurbo }
  63.  
  64. var
  65.   t : ieee;
  66.   r : real;
  67.  
  68. begin                                 { program }
  69.   assign(f, 'real87.dat');            { open input file }
  70.   reset(f);
  71.   while not eof(f) do
  72.   begin
  73.     read(f, t);                       { read an 8-byte real }
  74.     ieeetoturbo(t,  r);               { convert to a 6-byte real }
  75.     writeln(r);                       { display results }                     
  76.   end;
  77. end.                                  { program }
  78.  
  79.  
  80. program RegularTO87real;
  81.      { Converts a 6-byte real to an 8-byte, IEEE real.  }
  82. type
  83.   ieee       = array[1..8] of byte;
  84.   turbo_real = array[1..6] of byte;
  85.   rf         = file of ieee;
  86.  
  87. var
  88.   f : rf;
  89.   i : file of real;
  90.  
  91.  
  92.      {  Converts from a 6-byte Turbo Pascal real number to an  8-
  93.         byte, IEEE format. }
  94.  
  95. var
  96.   realthing : turbo_real absolute r;
  97.   exp : integer;
  98.  
  99.   sign, temp : byte;
  100.   i    : integer;
  101.  
  102. begin
  103.   fillchar(long, sizeof(long), 0);
  104.  
  105.   { build up exponent and sign of long real }
  106.  
  107.   sign := realthing[6] and $80;        { get sign bit from 6-byte }
  108.   exp := realthing[1] - $81;           { get exponent & take out bias}
  109.   exp := (exp + 1023) shl 4;           { re-bias && left justify }
  110.   exp := exp or (sign shl 8);          { put in sign }
  111.   long[8] := hi(exp);                  { insert into long real }
  112.   long[7] := lo(exp);
  113.  
  114.   { make mantissa }
  115.  
  116.   for i := 6 downto 3 do
  117.   begin
  118.  
  119.     { build up a byte }
  120.     temp := (realthing[i] and $7f shl 1) or 
  121.             (realthing[i - 1] and $80 shr 7);
  122.  
  123.     { split byte and insert into long real }
  124.     long[i+1] := long[i+1] + temp and $f0 shr 4;
  125.     long[i] := long[i] + temp and $f shl 4;
  126.  
  127.   end;
  128.  
  129.   { take care of last (incomplete) byte }
  130.   temp := realthing[2] and $7f shl 1;
  131.   long[3] := long[3] + temp and $f0 shr 4;
  132.   long[2] := long[2] + temp and $f shl 4;
  133.  
  134. end; { TurboToIEEE}
  135.  
  136. var
  137.   t : ieee;
  138.   r : real;
  139.   fname : string[80];
  140.  
  141.  
  142. begin                              { program }
  143.   write('input file name? ');      { open input file }
  144.   readln(fname);
  145.   assign(i, fname);
  146.   reset(i);
  147.   fname := '';
  148.   write('output file name? ');     { open output file }
  149.   readln(fname);
  150.   assign(f, fname);
  151.   rewrite(f);
  152.   while not eof(i) do
  153.   begin
  154.     read(i, r);                    { read a 6-byte real }
  155.     TurboToIEEE(r, t);             { convert to an 8-byte real }
  156.     write(f, t);                   { output result to file }
  157.   end;
  158.   close(f);
  159. end.       {program}               { close output file }                   
  160.