sinh.cpp 738 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // exp(x) - exp(-x)
  2. // sinh(x) = ----------------
  3. // 2
  4. #include "stdafx.h"
  5. #include "defs.h"
  6. void
  7. eval_sinh(void)
  8. {
  9. push(cadr(p1));
  10. eval();
  11. ysinh();
  12. }
  13. void
  14. ysinh(void)
  15. {
  16. save();
  17. yysinh();
  18. restore();
  19. }
  20. void
  21. yysinh(void)
  22. {
  23. double d;
  24. p1 = pop();
  25. if (car(p1) == symbol(ARCSINH)) {
  26. push(cadr(p1));
  27. return;
  28. }
  29. if (isdouble(p1)) {
  30. d = sinh(p1->u.d);
  31. if (fabs(d) < 1e-10)
  32. d = 0.0;
  33. push_double(d);
  34. return;
  35. }
  36. if (iszero(p1)) {
  37. push(zero);
  38. return;
  39. }
  40. push_symbol(SINH);
  41. push(p1);
  42. list(2);
  43. }
  44. #if SELFTEST
  45. static char *s[] = {
  46. "sinh(x)",
  47. "sinh(x)",
  48. "sinh(0)",
  49. "0",
  50. "sinh(arcsinh(x))",
  51. "x",
  52. };
  53. void
  54. test_sinh(void)
  55. {
  56. test(__FILE__, s, sizeof s / sizeof (char *));
  57. }
  58. #endif