|
|
1.1 root 1:
2: #include "complex.h"
3: #include "const.h"
4:
5: complex sin(complex z)
6: /*
7: sine of z: -i * sinh(i*z)
8: */
9: {
10: complex y = complex(-z.im, z.re); /* i * z */
11: y = sinh(y); /* csinh(y) */
12: return complex(y.im, -y.re); /* -i * y */
13: }
14:
15: complex sinh(complex z)
16: /*
17: The hyperbolic sine
18: */
19: {
20: double cosh_x, sinh_x, cos_y, sin_y;
21:
22: #define SINH_GOOD 1e7
23: #define SINH_HUGE 1e38
24:
25: if (z.re > MAX_EXPONENT) {
26: complex_error(C_SINH_RE, z.re);
27: cosh_x = sinh_x = SINH_HUGE;
28: }
29: else if (z.re < MIN_EXPONENT) {
30: complex_error(C_SINH_RE, z.re);
31: cosh_x = SINH_HUGE;
32: sinh_x = -SINH_HUGE;
33: }
34: else {
35: double pos_exp = exp(z.re);
36: double neg_exp = 1/pos_exp;
37: cosh_x = (pos_exp + neg_exp)/2;
38: sinh_x = (pos_exp - neg_exp)/2;
39: }
40:
41: if (ABS(z.im) > SINH_GOOD) {
42: complex_error(C_SINH_IM, z.im);
43: cos_y = sin_y = 0;
44: }
45: else {
46: cos_y = cos(z.im);
47: sin_y = sin(z.im);
48: }
49:
50: return complex(cos_y*sinh_x, sin_y*cosh_x);
51: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.