[Coco] Convert floating point formats

Walter Zambotti zambotti at iinet.net.au
Wed Aug 14 00:12:00 EDT 2019


Here is the PC side code that I ended up making to convert CoCo OS9 C PDP1 floating point numbers to modern PC IEEE754 floating point and visa versa.

union _Data
{
  unsigned long long llval;
  double dval;
  unsigned int lval;
  unsigned char bytes[8];
  unsigned short words[4];
  unsigned int dwords[2];
};

typedef union _Data PDP1data;
typedef union _Data IEEE754data;

double ConvertDBLPDP1toIEEE754(PDP1data PDP1data)
{
	IEEE754data iee754;
	unsigned long long signbit, exp, mantissa;

	if (PDP1data.llval == 0) 
	{
		return 0.0;
	}

	signbit  =  PDP1data.llval & 0x8000000000000000;
	exp  = (PDP1data.llval & 0x00000000000000ff) + 0x37e;
	mantissa =  PDP1data.llval & 0x7fffffffffffff00;

	iee754.llval = signbit | (exp<<52) | (mantissa>>11);

	return iee754.dval;
}

PDP1data ConvertDblIEEE754toPDP1(double dvalue)
{
	PDP1data PDP1data;
	IEEE754data IEEE754data;
	unsigned long long signbit, exp, mantissa;

	IEEE754data.dval = dvalue;

	// IEEE floats can have a negative zero that PDP1 floats cannot have
	// if the value is zero then we make it a good zero

	if (IEEE754data.dval == 0.0)
	{
		IEEE754data.llval = 0;
		return IEEE754data;
	}

	signbit  =   IEEE754data.llval & 0x8000000000000000;
	exp   = ((IEEE754data.llval & 0x7ff0000000000000)>>52) - 0x37e;
	mantissa =   IEEE754data.llval & 0x000fffffffffffff;

	PDP1data.llval = signbit | (exp) | (mantissa<<11);

	return PDP1data;
}

-----Original Message-----
From: Coco [mailto:coco-bounces at maltedmedia.com] On Behalf Of James Jones
Sent: Thursday, 4 July 2019 7:38 PM
To: CoCoList for Color Computer Enthusiasts <coco at maltedmedia.com>
Subject: Re: [Coco] Convert floating point formats

On Fri, May 24, 2019 at 9:30 AM Alex Evans <varmfskii at gmail.com> wrote:

> I don't have a line to a particular solution (though they should be 
> easy to implement), but do you mean IEEE double precision as is used 
> on current x86 CPUs, or are you saying that there was some other 
> floating point format used by x86 FPUs such as the 8087 sometime in 
> the past that you are interested in converting to/from. I also was 
> under the impression that the Microware C Compiler used IEEE floating 
> point in which case no conversion needs to be made, it is already in 
> the right format.
>

The switch to IEEE 754 floating point came with OS-9/68000.

--
Coco mailing list
Coco at maltedmedia.com
https://pairlist5.pair.net/mailman/listinfo/coco



More information about the Coco mailing list