[Coco] Convert floating point formats
wrcooke at wrcooke.net
wrcooke at wrcooke.net
Tue Aug 20 20:11:16 EDT 2019
To the best of my knowledge there was no C compiler for a PDP-1,
especially in 1985ish.
On August 20, 2019 at 7:07 PM Walter Zambotti
<[1]zambotti at iinet.net.au> wrote:
I'm looking at the manual now. I definitely have read it correctly.
If you are also correct then we have a case of multiple manual
versions!
And if you look at the one on the CoCo archive
[2]http://www.colorcomputerarchive.com/coco/Documents/Manuals/Progra
mming/Microware%20C%20Compiler%20User's%20Guide%20(Microware).pdf
It agrees with with me!!!
However searching through the manual the term PDP-1 only appears
once and the term PDP-11 appears 13 times.
My guess is I have found a typo!!!
And I think you are right and It should be PDP-11. Which memorably
is the computer I was baptised into computing with!
Walter
-----Original Message-----
From: Coco [mailto:[3]coco-bounces at maltedmedia.com] On Behalf Of
Walter Zambotti
Sent: Wednesday, 21 August 2019 7:55 AM
To: 'CoCoList for Color Computer Enthusiasts'
<[4]coco at maltedmedia.com>
Subject: Re: [Coco] Convert floating point formats
My manual says:
This compiler follows the PDP-1 implementation and format in that
CHARs are converted to INTs by sign extension, "SHORT" or "SHORT
INT"
means INT, "LONG INT" means LONG, and "LONG FLOAT" means DOUBLE. The
format of DOUBLE values is as follows:
-----Original Message-----
From: Coco [mailto:[5]coco-bounces at maltedmedia.com] On Behalf Of
Alex Evans
Sent: Wednesday, 21 August 2019 6:22 AM
To: CoCoList for Color Computer Enthusiasts
<[6]coco at maltedmedia.com>
Subject: Re: [Coco] Convert floating point formats
The OS-9 C Compiler Manual page 1-5
This compiler follows the PDP-11 implementation and format in that
CHARs are converted to INTs by sign extension, "SHORT" or "SHORT
INT"
means INT, "LONG INT" means LONG, and "LONG FLOAT" means DOUBLE. The
format of DOUBLE values is as follows:
<figure removed>
The form of the mantissa is sign and magnitude with an implied "1"
bit at the sign bit position. The exponent is biased by 128. The
format of the FLOAT is identical, except that the mantissa is only
three bytes long. Conversion from DOUBLE to FLOAT is carried out by
truncating the least significant (right-most) four bytes of the
mantissa. The reverse conversion is done by padding the least
significant our mantissa bytes with zeros.
On Tue, Aug 20, 2019 at 6:25 AM Joel Rees <[7]joel.rees at gmail.com>
wrote:
>
2019年8月20日(火) 17:02 Walter Zambotti <[8]zambotti at iinet.net.au>:
Not sure why it is PDP1 but that is how it is documented in the C
manual!
Which C manual?
Walter
-----Original Message-----
From: Coco [mailto:[9]coco-bounces at maltedmedia.com] On Behalf Of
James
Jones
Sent: Tuesday, 20 August 2019 12:13 PM
To: CoCoList for Color Computer Enthusiasts
<[10]coco at maltedmedia.com>
Subject: Re: [Coco] Convert floating point formats
I'm a little confused by the name PDP1data; the PDP-1 had an 18-bit
word, did one's complement arithmetic, and the floating point
library referenced in
[11]https://web.archive.org/web/20110514105011/http://www.dbit.com/~
gree
ng3/pdp1/pdp1.html
used
two words for a value, with one word for mantissa (and presumably
sign
bit) and one for the exponent.
On Tue, Aug 13, 2019 at 11:12 PM Walter Zambotti
<[12]zambotti at iinet.net.au>
wrote:
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:[13]coco-bounces at maltedmedia.com] On Behalf Of
James Jones
Sent: Thursday, 4 July 2019 7:38 PM
To: CoCoList for Color Computer Enthusiasts
<[14]coco at maltedmedia.com>
Subject: Re: [Coco] Convert floating point formats
On Fri, May 24, 2019 at 9:30 AM Alex Evans <[15]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
[16]Coco at maltedmedia.com
[17]https://pairlist5.pair.net/mailman/listinfo/coco
--
Coco mailing list
[18]Coco at maltedmedia.com
[19]https://pairlist5.pair.net/mailman/listinfo/coco
--
Coco mailing list
[20]Coco at maltedmedia.com
[21]https://pairlist5.pair.net/mailman/listinfo/coco
--
Coco mailing list
[22]Coco at maltedmedia.com
[23]https://pairlist5.pair.net/mailman/listinfo/coco
--
Coco mailing list
[24]Coco at maltedmedia.com
[25]https://pairlist5.pair.net/mailman/listinfo/coco
--
Coco mailing list
[26]Coco at maltedmedia.com
[27]https://pairlist5.pair.net/mailman/listinfo/coco
--
Coco mailing list
[28]Coco at maltedmedia.com
[29]https://pairlist5.pair.net/mailman/listinfo/coco
--
Coco mailing list
[30]Coco at maltedmedia.com
[31]https://pairlist5.pair.net/mailman/listinfo/coco
"A designer knows he has achieved perfection not when there is nothing
left to add, but when there is nothing left to take away." -- Antoine
de Saint-Exupery
"The names of global variables should start with // "
-- https://isocpp.org
References
1. mailto:zambotti at iinet.net.au
2. http://www.colorcomputerarchive.com/coco/Documents/Manuals/Programming/Microware C Compiler User's Guide (Microware).pdf
3. mailto:coco-bounces at maltedmedia.com
4. mailto:coco at maltedmedia.com
5. mailto:coco-bounces at maltedmedia.com
6. mailto:coco at maltedmedia.com
7. mailto:joel.rees at gmail.com
8. mailto:zambotti at iinet.net.au
9. mailto:coco-bounces at maltedmedia.com
10. mailto:coco at maltedmedia.com
11. https://web.archive.org/web/20110514105011/http://www.dbit.com/~gree
12. mailto:zambotti at iinet.net.au
13. mailto:coco-bounces at maltedmedia.com
14. mailto:coco at maltedmedia.com
15. mailto:varmfskii at gmail.com
16. mailto:Coco at maltedmedia.com
17. https://pairlist5.pair.net/mailman/listinfo/coco
18. mailto:Coco at maltedmedia.com
19. https://pairlist5.pair.net/mailman/listinfo/coco
20. mailto:Coco at maltedmedia.com
21. https://pairlist5.pair.net/mailman/listinfo/coco
22. mailto:Coco at maltedmedia.com
23. https://pairlist5.pair.net/mailman/listinfo/coco
24. mailto:Coco at maltedmedia.com
25. https://pairlist5.pair.net/mailman/listinfo/coco
26. mailto:Coco at maltedmedia.com
27. https://pairlist5.pair.net/mailman/listinfo/coco
28. mailto:Coco at maltedmedia.com
29. https://pairlist5.pair.net/mailman/listinfo/coco
30. mailto:Coco at maltedmedia.com
31. https://pairlist5.pair.net/mailman/listinfo/coco
More information about the Coco
mailing list