fminimum_mag, fminimum_mag_num and corresponding functions for float,
long double, _FloatN and _FloatNx.
+* <math.h> macros for single-precision float constants are added as a
+ GNU extension: M_Ef, M_LOG2Ef, M_LOG10Ef, M_LN2f, M_LN10f, M_PIf,
+ M_PI_2f, M_PI_4f, M_1_PIf, M_2_PIf, M_2_SQRTPIf, M_SQRT2f and
+ M_SQRT1_2f.
+
* The __STDC_IEC_60559_BFP__ and __STDC_IEC_60559_COMPLEX__ macros are
predefined as specified in TS 18661-1:2014.
@xref{Feature Test Macros}.
All values are of type @code{double}. As an extension, @theglibc{}
-also defines these constants with type @code{long double}. The
-@code{long double} macros have a lowercase @samp{l} appended to their
-names: @code{M_El}, @code{M_PIl}, and so forth. These are only
+also defines these constants with type @code{long double} and
+@code{float}. The @code{long double} macros have a lowercase @samp{l}
+while the @code{float} macros have a lowercase @samp{f} appended to
+their names: @code{M_El}, @code{M_PIl}, and so forth. These are only
available if @code{_GNU_SOURCE} is defined.
Likewise, @theglibc{} also defines these constants with the types
}
res = M_SUF (__clog) (y);
- __real__ res += (FLOAT) M_MLIT (M_LN2);
+ __real__ res += M_MLIT (M_LN2);
}
else if (rx >= M_LIT (0.5) && ix < M_EPSILON / 8)
{
# define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
#endif
+/* GNU extension to provide float constants with similar names. */
+#ifdef __USE_GNU
+# define M_Ef 2.7182818284590452354f /* e */
+# define M_LOG2Ef 1.4426950408889634074f /* log_2 e */
+# define M_LOG10Ef 0.43429448190325182765f /* log_10 e */
+# define M_LN2f 0.69314718055994530942f /* log_e 2 */
+# define M_LN10f 2.30258509299404568402f /* log_e 10 */
+# define M_PIf 3.14159265358979323846f /* pi */
+# define M_PI_2f 1.57079632679489661923f /* pi/2 */
+# define M_PI_4f 0.78539816339744830962f /* pi/4 */
+# define M_1_PIf 0.31830988618379067154f /* 1/pi */
+# define M_2_PIf 0.63661977236758134308f /* 2/pi */
+# define M_2_SQRTPIf 1.12837916709551257390f /* 2/sqrt(pi) */
+# define M_SQRT2f 1.41421356237309504880f /* sqrt(2) */
+# define M_SQRT1_2f 0.70710678118654752440f /* 1/sqrt(2) */
+#endif
+
/* The above constants are not adequate for computation using `long double's.
Therefore we provide as an extension constants with similar names as a
GNU extension. Provide enough digits for the 128-bit IEEE quad. */
{
y = M_SUF (__casin) (x);
- __real__ res = (FLOAT) M_MLIT (M_PI_2) - __real__ y;
+ __real__ res = M_MLIT (M_PI_2) - __real__ y;
if (__real__ res == 0)
__real__ res = 0;
__imag__ res = -__imag__ y;
if (M_FABS (__imag__ x) == 1
&& M_FABS (__real__ x) < M_EPSILON * M_EPSILON)
__imag__ res = (M_COPYSIGN (M_LIT (0.5), __imag__ x)
- * ((FLOAT) M_MLIT (M_LN2)
+ * (M_MLIT (M_LN2)
- M_LOG (M_FABS (__real__ x))));
else
{
if (M_FABS (__real__ x) == 1
&& M_FABS (__imag__ x) < M_EPSILON * M_EPSILON)
__real__ res = (M_COPYSIGN (M_LIT (0.5), __real__ x)
- * ((FLOAT) M_MLIT (M_LN2)
+ * (M_MLIT (M_LN2)
- M_LOG (M_FABS (__imag__ x))));
else
{
if (absx == 1 && scale == 0)
{
__real__ result = (M_LOG1P (absy * absy)
- * ((FLOAT) M_MLIT (M_LOG10E) / 2));
+ * (M_MLIT (M_LOG10E) / 2));
math_check_force_underflow_nonneg (__real__ result);
}
else if (absx > 1 && absx < 2 && absy < 1 && scale == 0)
FLOAT d2m1 = (absx - 1) * (absx + 1);
if (absy >= M_EPSILON)
d2m1 += absy * absy;
- __real__ result = M_LOG1P (d2m1) * ((FLOAT) M_MLIT (M_LOG10E) / 2);
+ __real__ result = M_LOG1P (d2m1) * (M_MLIT (M_LOG10E) / 2);
}
else if (absx < 1
&& absx >= M_LIT (0.5)
&& scale == 0)
{
FLOAT d2m1 = (absx - 1) * (absx + 1);
- __real__ result = M_LOG1P (d2m1) * ((FLOAT) M_MLIT (M_LOG10E) / 2);
+ __real__ result = M_LOG1P (d2m1) * (M_MLIT (M_LOG10E) / 2);
}
else if (absx < 1
&& absx >= M_LIT (0.5)
&& absx * absx + absy * absy >= M_LIT (0.5))
{
FLOAT d2m1 = M_SUF (__x2y2m1) (absx, absy);
- __real__ result = M_LOG1P (d2m1) * ((FLOAT) M_MLIT (M_LOG10E) / 2);
+ __real__ result = M_LOG1P (d2m1) * (M_MLIT (M_LOG10E) / 2);
}
else
{
if (__glibc_unlikely (rcls == FP_ZERO && icls == FP_ZERO))
{
/* Real and imaginary part are 0.0. */
- __imag__ result = signbit (__real__ x) ? (FLOAT) M_MLIT (M_PI) : 0;
+ __imag__ result = signbit (__real__ x) ? M_MLIT (M_PI) : 0;
__imag__ result = M_COPYSIGN (__imag__ result, __imag__ x);
/* Yes, the following line raises an exception. */
__real__ result = -1 / M_FABS (__real__ x);
else
{
FLOAT d = M_HYPOT (absx, absy);
- __real__ result = M_LOG (d) - scale * (FLOAT) M_MLIT (M_LN2);
+ __real__ result = M_LOG (d) - scale * M_MLIT (M_LN2);
}
__imag__ result = M_ATAN2 (__imag__ x, __real__ x);
#define M_STRTO_NAN __strtof_nan
#define M_USE_BUILTIN(c) USE_ ##c ##F_BUILTIN
-/* Standard/GNU macro literals do not exist for the float type. Use
- the double macro constants. */
-#define M_MLIT(c) c
+/* GNU extension float constant macros. */
+#define M_MLIT(c) c ## f
#include <libm-alias-float.h>
#include <math-nan-payload-float.h>
float x_adj_frac = x_adj - x_adj_int;
int x_adj_log2;
float x_adj_mant = __frexpf (x_adj, &x_adj_log2);
- if (x_adj_mant < (float) M_SQRT1_2)
+ if (x_adj_mant < M_SQRT1_2f)
{
x_adj_log2--;
x_adj_mant *= 2.0f;
float ret = (__ieee754_powf (x_adj_mant, x_adj)
* __ieee754_exp2f (x_adj_log2 * x_adj_frac)
* __ieee754_expf (-x_adj)
- * sqrtf (2 * (float) M_PI / x_adj)
+ * sqrtf (2 * M_PIf / x_adj)
/ prod);
exp_adj += x_eps * __ieee754_logf (x_adj);
float bsum = gamma_coeff[NCOEFF - 1];
if (frac > 0.5f)
frac = 1.0f - frac;
float sinpix = (frac <= 0.25f
- ? __sinf ((float) M_PI * frac)
- : __cosf ((float) M_PI * (0.5f - frac)));
+ ? __sinf (M_PIf * frac)
+ : __cosf (M_PIf * (0.5f - frac)));
int exp2_adj;
- float tret = (float) M_PI / (-x * sinpix
- * gammaf_positive (-x, &exp2_adj));
+ float tret = M_PIf / (-x * sinpix
+ * gammaf_positive (-x, &exp2_adj));
ret = __scalbnf (tret, -exp2_adj);
math_check_force_underflow_nonneg (ret);
}
float index_f;
int index;
- index_f = roundf ((x - FIRST_ZERO_J0) / (float) M_PI);
+ index_f = roundf ((x - FIRST_ZERO_J0) / M_PIf);
/* j0f_asympt fails to give an error <= 9 ulps for x=0x1.324e92p+7
(index 48) thus we can't reduce SMALL_SIZE below 49. */
if (index_f >= SMALL_SIZE)
float index_f;
int index;
- index_f = roundf ((x - FIRST_ZERO_Y0) / (float) M_PI);
+ index_f = roundf ((x - FIRST_ZERO_Y0) / M_PIf);
if (index_f >= SMALL_SIZE)
return y0f_asympt (x);
index = (int) index_f;
x = -x;
sign = -1.0f;
}
- index_f = roundf ((x - FIRST_ZERO_J1) / (float) M_PI);
+ index_f = roundf ((x - FIRST_ZERO_J1) / M_PIf);
if (index_f >= SMALL_SIZE)
return sign * j1f_asympt (x);
index = (int) index_f;
float index_f;
int index;
- index_f = roundf ((x - FIRST_ZERO_Y1) / (float) M_PI);
+ index_f = roundf ((x - FIRST_ZERO_Y1) / M_PIf);
if (index_f >= SMALL_SIZE)
return y1f_asympt (x);
index = (int) index_f;
tmp = n;
v = two/x;
tmp = tmp*__ieee754_logf(fabsf(v*tmp));
- if(tmp<(float)8.8721679688e+01) {
+ if(tmp<8.8721679688e+01f) {
for(i=n-1,di=(float)(i+i);i>0;i--){
temp = b;
b *= di;
lg_sinpi (float x)
{
if (x <= 0.25f)
- return __sinf ((float) M_PI * x);
+ return __sinf (M_PIf * x);
else
- return __cosf ((float) M_PI * (0.5f - x));
+ return __cosf (M_PIf * (0.5f - x));
}
/* Compute cos (pi * X) for -0.25 <= X <= 0.5. */
lg_cospi (float x)
{
if (x <= 0.25f)
- return __cosf ((float) M_PI * x);
+ return __cosf (M_PIf * x);
else
- return __sinf ((float) M_PI * (0.5f - x));
+ return __sinf (M_PIf * (0.5f - x));
}
/* Compute cot (pi * X) for -0.25 <= X <= 0.5. */
if(k==0) return zero;
else {c += k*ln2_lo; return k*ln2_hi+c;}
}
- R = hfsq*((float)1.0-(float)0.66666666666666666*f);
+ R = hfsq*(1.0f-0.66666666666666666f*f);
if(k==0) return f-R; else
return k*ln2_hi-((R-(k*ln2_lo+c))-f);
}