I think basic reference information you may be looking for is on page

http://www.merlyn.demon.co.uk/pas-type.htm------------------------------------------------------------------

real2double from rtl/inc/genmath.inc

------------------------------------------------------------------

function real2double(r : real48) : double;

var

res : array[0..7] of byte;

exponent : word;

begin

{ copy mantissa }

res[0]:=0;

res[1]:=r[1] shl 5;

res[2]:=(r[1] shr 3) or (r[2] shl 5);

res[3]:=(r[2] shr 3) or (r[3] shl 5);

res[4]:=(r[3] shr 3) or (r[4] shl 5);

res[5]:=(r[4] shr 3) or (r[5] and $7f) shl 5;

res[6]:=(r[5] and $7f) shr 3;

{ copy exponent }

{ correct exponent: }

exponent:=(word(r[0])+(1023-129));

res[6]:=res[6] or ((exponent and $f) shl 4);

res[7]:=exponent shr 4;

{ set sign }

res[7]:=res[7] or (r[5] and $80);

real2double:=double(res);

end;

------------------------------------------------------------------

double2real by just mechanically reversed operations

------------------------------------------------------------------

function double2real(d : double) : real48;

var

res : real48;

exponent : word;

begin

{ copy mantissa }

res[0]:=0;

res[1]:=(d[2] shl 3) or (d[1] shr 5);

res[2]:=(d[3] shl 3) or (d[2] shr 5);

res[3]:=(d[4] shl 3) or (d[3] shr 5);

res[4]:=(d[5] shl 3) or (d[4] shr 5);

res[5]:=((d[6] and $f) shl 3) or (d[5] shr 5);

{ copy exponent }

{ correct exponent: }

exponent:= ((d[7] and $7f) shl 4) or ((d[6] shr 4) and $f);

exponent:= exponent +129-1023;

res[0]:= exponent and $ff;

{ set sign }

res[5]:=res[5] or (d[7] and $80);

double2real:=res;

end;

------------------------------------------------------------------

The code above will probably not compile as I use indexes of bytes

bytes on type double.

I don't have a working compiler at this moment.

(FPC is not compiling on OSX)

Would this help you?

Could you write some tests to verify correctness?

Jan

On Sep 20, 2005, at 12:14, Lowell C. Savage wrote:

> What I would still like to see is a "Double2Real" which goes in the

> opposite direction of the "Real2Double". That way, I can read the

> data from the existing files and then save new data back to the same

> files. The loss of precision is not important since the numbers we

> are using have limitations on their precision that are the limiting

> factor (they could probably be "singles" without any trouble--except

> that then they wouldn't be compatible with the data files. And

> performance isn't really an issue since I'll do any calculations as

> doubles (native on x86 platform).

>

> Thanks,

>

> Lowell

>

> Florian Klaempfl <

[hidden email]> wrote, in part:

>> Lowell C. Savage wrote:

>>

>> > Has anyone come up with a set of routines for converting between

>> Turbo

>> > Pascal's 6-byte "real" format and FPC's real number format?

>>

>>

http://www.freepascal.org/docs-html/rtl/system/real2double.html>

> Thanks. My apologies for not finding it earlier myself.

>

>> > Here's a simple program to demonstrate the issue. In Turbo Pascal

>> 5.5

>> > (Downloaded from

>>

http://bdn.borland.com/article/0,1410,20803,00.html)

>> > this code generates a 12-byte file. FPC generates a 16-byte file.

>> > (Actually, the preprocessor directives shown appear to have no

>> effect on

>>

>> What effect should it have?

>

> I would like it to have the same effect whether compiled under Turbo

> Pascal 5.5 or under FPC. In both cases, it should write out a 12-byte

> file. I don't mind if I have to put in a bunch of ifdefs to define

> "real48" and dummy "Double2Real" functions for TP or some such and

> redo the assignments to call "Double2Real". In other words, the code

> can change--but the data (and data format) is forever. :-)

>

>> > this code--not complaining since the docs don't make it appear that

>> it

>> > should, just pointing it out.)

>>

>> The 6 byte real isn't supported by fpc because it isn't handled by the

>> fpu and thus deadly slow. For maybe 12 years, every new PC has an fpu.

>

>

> Heavens no! I don't want to do !!CALCULATIONS!! with the 6-byte

> reals. I just want to be able to read and store them in the existing

> files.

>

>> > Program testrec;

>> > {$IFDEF FPC}

>> > {$MODE TP}

>> > {$PACKRECORDS 1}

>> > {$ENDIF}

>> > type

>> > realrec = record

>> > t1 : real;

>> > t2 : real;

>> > end;

>> >

>> > var

>> > realfile : file of realrec;

>> > r : realrec;

>> > begin

>> > r.t1 := 1.0;

>> > r.t2 := 2.0;

>> > assign ( realfile, 'c:\r.rfl' );

>> > rewrite ( realfile );

>> > write ( realfile, r );

>> > close ( realfile );

>> > end.

>

> Lowell C. Savage

>

[hidden email]
> 505-667-6964 (office/msg)

> 360-961-8965 (cell/msg)

> 505-667-4341 (shared fax)

>

> _______________________________________________

> fpc-pascal maillist -

[hidden email]
>

http://lists.freepascal.org/mailman/listinfo/fpc-pascal>

_______________________________________________

fpc-pascal maillist -

[hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal