cif4.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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 SINGLE (CIF n 4)
  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. cif4(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. SINGLE *result;
  23. zrf_ext(&buf);
  24. if (ss == sizeof(long)) {
  25. buf.exp = 31;
  26. i_src = src;
  27. result = (SINGLE *) &src;
  28. }
  29. else {
  30. ipt = (short *) &src;
  31. i_src = (long) *ipt;
  32. buf.exp = 15;
  33. result = (SINGLE *) &ss;
  34. }
  35. if (i_src == 0) {
  36. *result = (SINGLE) 0L;
  37. return;
  38. }
  39. /* ESTABLISHED THAT src != 0 */
  40. /* adjust exponent field */
  41. buf.sign = (i_src < 0) ? 0x8000 : 0;
  42. /* clear sign bit of integer */
  43. /* move to mantissa field */
  44. buf.m1 = (i_src < 0) ? -i_src : i_src;
  45. /* adjust mantissa field */
  46. if (ss != sizeof(long))
  47. buf.m1 <<= 16;
  48. nrm_ext(&buf); /* adjust mantissa field */
  49. compact(&buf, result,sizeof(SINGLE)); /* put on stack */
  50. }