cuf8.c 1010 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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 (CUF 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. cuf8(ss,src)
  16. int ss; /* source size */
  17. long src; /* largest possible integer to convert */
  18. {
  19. EXTEND buf;
  20. short *ipt;
  21. long i_src;
  22. zrf_ext(&buf);
  23. if (ss == sizeof(long)) {
  24. buf.exp = 31;
  25. i_src = src;
  26. }
  27. else {
  28. ipt = (short *) &src;
  29. i_src = (long) *ipt;
  30. buf.exp = 15;
  31. }
  32. if (i_src == 0) {
  33. zrf8((DOUBLE *)((void *)&ss));
  34. return;
  35. }
  36. /* ESTABLISHED THAT src != 0 */
  37. /* adjust exponent field */
  38. if (ss != sizeof(long))
  39. i_src <<= 16;
  40. /* move to mantissa field */
  41. buf.m1 = i_src;
  42. /* adjust mantissa field */
  43. nrm_ext(&buf);
  44. compact(&buf,(unsigned long *) (void *)&ss,8);
  45. }