1 diff --git a/k_exp.cpp b/k_exp.cpp
5 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
6 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
10 //#include <sys/cdefs.h>
11 //__FBSDID("$FreeBSD$");
15 #include "math_private.h"
17 static const uint32_t k = 1799; /* constant for reduction */
18 static const double kln2 = 1246.97177782734161156; /* k * ln2 */
21 * Compute exp(x), scaled to avoid spurious overflow. An exponent is
22 * returned separately in 'expt'.
23 @@ -78,33 +76,8 @@ __ldexp_exp(double x, int expt)
27 exp_x = __frexp_exp(x, &ex_expt);
29 INSERT_WORDS(scale, (0x3ff + expt) << 20, 0);
30 return (exp_x * scale);
34 -__ldexp_cexp(double complex z, int expt)
36 - double c, exp_x, s, scale1, scale2, x, y;
37 - int ex_expt, half_expt;
41 - exp_x = __frexp_exp(x, &ex_expt);
45 - * Arrange so that scale1 * scale2 == 2**expt. We use this to
46 - * compensate for scalbn being horrendously slow.
48 - half_expt = expt / 2;
49 - INSERT_WORDS(scale1, (0x3ff + half_expt) << 20, 0);
50 - half_expt = expt - half_expt;
51 - INSERT_WORDS(scale2, (0x3ff + half_expt) << 20, 0);
54 - return (CMPLX(c * exp_x * scale1 * scale2,
55 - s * exp_x * scale1 * scale2));
57 --- a/k_expf.cpp 2022-12-13 14:39:11.791594163 -0500
58 +++ b/k_expf.cpp 2022-12-13 14:39:18.631622916 -0500
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
65 //#include <sys/cdefs.h>
66 //__FBSDID("$FreeBSD$");
70 #include "math_private.h"
72 static const uint32_t k = 235; /* constant for reduction */
73 static const float kln2 = 162.88958740F; /* k * ln2 */
76 * See k_exp.c for details.
82 exp_x = __frexp_expf(x, &ex_expt);
84 SET_FLOAT_WORD(scale, (0x7f + expt) << 23);
85 return (exp_x * scale);
89 -__ldexp_cexpf(float complex z, int expt)
91 - float c, exp_x, s, scale1, scale2, x, y;
92 - int ex_expt, half_expt;
96 - exp_x = __frexp_expf(x, &ex_expt);
99 - half_expt = expt / 2;
100 - SET_FLOAT_WORD(scale1, (0x7f + half_expt) << 23);
101 - half_expt = expt - half_expt;
102 - SET_FLOAT_WORD(scale2, (0x7f + half_expt) << 23);
104 - sincosf(y, &s, &c);
105 - return (CMPLXF(c * exp_x * scale1 * scale2,
106 - s * exp_x * scale1 * scale2));