|
|
1.1 root 1:
2: #include "complex.h"
3: #include "const.h"
4:
5:
6: complex exp(complex z)
7: /*
8: The complex exponentiation function: e**z, e being 2.718281828...
9:
10: In case of overflow, return EXPHUGE with the appropriate phase.
11: In case of underflow return 0.
12: In case of ridiculous input to "sin" and "cos", return 0.
13: */
14: {
15: complex answer;
16: double radius, sin_theta, cos_theta;
17:
18: #define EXPHUGE 1e38
19: #define EXPGOOD 1e7
20:
21: if (z.re > MAX_EXPONENT) {
22: complex_error(C_EXP_RE_POS, z.re);
23: radius = EXPHUGE;
24: }
25: else if (z.re < MIN_EXPONENT) {
26: complex_error(C_EXP_RE_NEG, z.re);
27: radius = 0;
28: }
29: else {
30: radius = exp(z.re);
31: }
32:
33: if (z.im > EXPGOOD || z.im < -EXPGOOD) {
34: complex_error(C_EXP_IM, z.im);
35: sin_theta = cos_theta = 0;
36: }
37: else {
38: sin_theta = sin(z.im);
39: cos_theta = cos(z.im);
40: }
41:
42: answer.re = radius * cos_theta;
43: answer.im = radius * sin_theta;
44:
45: return answer;
46: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.