home *** CD-ROM | disk | FTP | other *** search
- Program DoubConv;
- {$N+}
-
- { This program demonstrates the conversion of a 8 byte Turbo Pascal }
- { real variable type by re-creating the exponent and Mantissa. }
- { The temporary variable Mantissa accumulates the value stored in }
- { bytes 2 through 8. }
-
-
- type EightByteArray = array[1..8] of byte;
- UserReal = Extended; { Insert appropriate type to convert 8 byte
- real type to. }
-
- var r : double;
- s : EightByteArray absolute r;
- { Allow access to individual real type bytes }
- i,j : byte;
- PosFlag : boolean;
- Mantissa : UserReal;
- Exponent : integer;
- Number : UserReal;
-
- { the mantissa and number can be typed as to the number desired }
- { i.e. Real, Single, Extended, BCD }
-
- function power (x,y : integer) : UserReal;
- begin
- power := exp(y * ln(x));
- end;
-
- begin
- write('Enter floating point Number ');
- readln(r);
- PosFlag := ($80 and s[8]) = 0;
- { Check if entry is positive from bit 7 of byte 8 }
- s[8] := s[8] and $7F; { Force bit 7 of byte 8 off }
- Mantissa := 0.0; { Initialize the Mantissa }
- for i := 1 to 6 do { Check each byte of mantissa }
- for j := 0 to 7 do { Check each bit }
- if ((s[i] shr j) and 1 ) = 1 then
- Mantissa := Mantissa + power(2, (j + (i-1) * 8));
- { Increment mantissa appropriately }
- for j := 0 to 3 do { get mantissa info from byte 7 }
- if ((s[7] shr j) and 1) = 1 then
- Mantissa := Mantissa + power(2, (j + 48));
- { Increment mantissa appropriately }
- { add the assumed mantissa value at bit 52 }
- Mantissa := (Mantissa + power(2,52)) / power(2,52);
- { Normalize the number by dividing by 2^52 }
-
- Exponent := s[7] shr 4;
- Exponent := Exponent + s[8] * 16;
-
- if (Exponent > 0) and (Exponent < 2047) then begin
- Exponent := Exponent - 1023;
- Number := Mantissa * power(2, exponent);
- { Get number by multiply Mantissa by the exponent }
- end
- else
- if (Exponent = 0) then begin
- if mantissa <> 0 then
- Number := Mantissa * power(2, -1022);
- end
- else number := 0;
- if not PosFlag then Number := Number * -1;
- writeln(Number);
- readln;
- end.
-
-