float.cpp 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "stdafx.h"
  2. #include "defs.h"
  3. void
  4. eval_float(void)
  5. {
  6. push(cadr(p1));
  7. eval();
  8. yyfloat();
  9. eval(); // normalize
  10. }
  11. void
  12. yyfloat(void)
  13. {
  14. int i, h;
  15. save();
  16. p1 = pop();
  17. if (iscons(p1)) {
  18. h = tos;
  19. while (iscons(p1)) {
  20. push(car(p1));
  21. yyfloat();
  22. p1 = cdr(p1);
  23. }
  24. list(tos - h);
  25. } else if (p1->k == TENSOR) {
  26. push(p1);
  27. copy_tensor();
  28. p1 = pop();
  29. for (i = 0; i < p1->u.tensor->nelem; i++) {
  30. push(p1->u.tensor->elem[i]);
  31. yyfloat();
  32. p1->u.tensor->elem[i] = pop();
  33. }
  34. push(p1);
  35. } else if (p1->k == NUM) {
  36. push(p1);
  37. bignum_float();
  38. } else if (p1 == symbol(PI))
  39. push_double(M_PI);
  40. else if (p1 == symbol(E))
  41. push_double(M_E);
  42. else
  43. push(p1);
  44. restore();
  45. }
  46. #if SELFTEST
  47. static char *s[] = {
  48. "float(x)",
  49. "x",
  50. "float(1/2)",
  51. "0.5",
  52. "float(pi)",
  53. "3.14159",
  54. "float(exp(1))",
  55. "2.71828",
  56. "x=(1/2,1/4)",
  57. "",
  58. "float(x)",
  59. "(0.5,0.25)",
  60. "x",
  61. "(1/2,1/4)",
  62. "x=quote(x)",
  63. "",
  64. };
  65. void
  66. test_float(void)
  67. {
  68. test(__FILE__, s, sizeof s / sizeof (char *));
  69. }
  70. #endif