[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