cif8.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3. See the copyright notice in the ACK home directory, in the file "Copyright".
  4. */
  5. /* $Id$ */
  6. /*
  7. CONVERT INTEGER TO FLOAT (CIF n 8)
  8. THIS ROUTINE WORKS BY FILLING AN EXTENDED
  9. WITH THE INTEGER VALUE IN EXTENDED FORMAT
  10. AND USES COMPACT() TO PUT IT INTO THE PROPER
  11. FLOATING POINT PRECISION.
  12. */
  13. #include "FP_types.h"
  14. void
  15. cif8(ss,src)
  16. int ss; /* source size */
  17. long src; /* largest possible integer to convert */
  18. {
  19. EXTEND buf;
  20. DOUBLE *result; /* for return value */
  21. short *ipt;
  22. long i_src;
  23. result = (DOUBLE *) ((void *) &ss); /* always */
  24. zrf_ext(&buf);
  25. if (ss == sizeof(long)) {
  26. buf.exp = 31;
  27. i_src = src;
  28. }
  29. else {
  30. ipt = (short *) &src;
  31. i_src = (long) *ipt;
  32. buf.exp = 15;
  33. }
  34. if (i_src == 0) {
  35. zrf8(result);
  36. return;
  37. }
  38. /* ESTABLISHED THAT src != 0 */
  39. /* adjust exponent field */
  40. buf.sign = (i_src < 0) ? 0x8000 : 0;
  41. /* clear sign bit of integer */
  42. /* move to mantissa field */
  43. buf.m1 = (i_src < 0) ? -i_src : i_src;
  44. /* adjust mantissa field */
  45. if (ss != sizeof(long))
  46. buf.m1 <<= 16;
  47. nrm_ext(&buf);
  48. compact(&buf,&result->d[0],8);
  49. }