Apply fix for ld80 and ld128 submitted by Steve Kargl:
- Micro-optimization: use sincosl(x) instead of a call to cosl(x) and a call to sinl(x). Argument reduction is done once not twice. - Use a long double constant instead of an invalid double constant. - Spell scale2 correctly He could not test ld128, so that patch is untested. Submitted by: sgk at troutmask.apl.washington.edu (Steve Kargl)
This commit is contained in:
parent
85ee267a3e
commit
a67cc94327
@ -300,7 +300,7 @@ hexpl(long double x)
|
||||
static inline long double complex
|
||||
__ldexp_cexpl(long double complex z, int expt)
|
||||
{
|
||||
long double exp_x, hi, lo;
|
||||
long double c, exp_x, hi, lo, s;
|
||||
long double x, y, scale1, scale2;
|
||||
int half_expt, k;
|
||||
|
||||
@ -308,16 +308,17 @@ __ldexp_cexpl(long double complex z, int expt)
|
||||
y = cimagl(z);
|
||||
__k_expl(x, &hi, &lo, &k);
|
||||
|
||||
exp_x = (lo + hi) * 0x1p16382;
|
||||
exp_x = (lo + hi) * 0x1p16382L;
|
||||
expt += k - 16382;
|
||||
|
||||
scale1 = 1;
|
||||
half_expt = expt / 2;
|
||||
SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
|
||||
scale2 = 1;
|
||||
SET_LDBL_EXPSIGN(scale1, BIAS + expt - half_expt);
|
||||
SET_LDBL_EXPSIGN(scale2, BIAS + expt - half_expt);
|
||||
|
||||
return (CMPLXL(cos(y) * exp_x * scale1 * scale2,
|
||||
sinl(y) * exp_x * scale1 * scale2));
|
||||
sincosl(y, &s, &c);
|
||||
return (CMPLXL(c * exp_x * scale1 * scale2,
|
||||
s * exp_x * scale1 * scale2));
|
||||
}
|
||||
#endif /* _COMPLEX_H */
|
||||
|
@ -277,7 +277,7 @@ hexpl(long double x)
|
||||
static inline long double complex
|
||||
__ldexp_cexpl(long double complex z, int expt)
|
||||
{
|
||||
long double exp_x, hi, lo;
|
||||
long double c, exp_x, hi, lo, s;
|
||||
long double x, y, scale1, scale2;
|
||||
int half_expt, k;
|
||||
|
||||
@ -285,16 +285,17 @@ __ldexp_cexpl(long double complex z, int expt)
|
||||
y = cimagl(z);
|
||||
__k_expl(x, &hi, &lo, &k);
|
||||
|
||||
exp_x = (lo + hi) * 0x1p16382;
|
||||
exp_x = (lo + hi) * 0x1p16382L;
|
||||
expt += k - 16382;
|
||||
|
||||
scale1 = 1;
|
||||
half_expt = expt / 2;
|
||||
SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
|
||||
scale2 = 1;
|
||||
SET_LDBL_EXPSIGN(scale1, BIAS + expt - half_expt);
|
||||
SET_LDBL_EXPSIGN(scale2, BIAS + expt - half_expt);
|
||||
|
||||
return (CMPLXL(cos(y) * exp_x * scale1 * scale2,
|
||||
sinl(y) * exp_x * scale1 * scale2));
|
||||
sincosl(y, &s, &c);
|
||||
return (CMPLXL(c * exp_x * scale1 * scale2,
|
||||
s * exp_x * scale1 * scale2));
|
||||
}
|
||||
#endif /* _COMPLEX_H */
|
||||
|
Loading…
Reference in New Issue
Block a user