mirror of
git://sourceware.org/git/glibc.git
synced 2024-12-15 04:20:28 +08:00
505b5b2922
The threshold value at which powf overflows depends on the rounding mode and the current check did not take this into account. So when the result was rounded away from zero it could become infinity without setting errno to ERANGE. Example: pow(0x1.7ac7cp+5, 23) is 0x1.fffffep+127 + 0.1633ulp If the result goes above 0x1.fffffep+127 + 0.5ulp then errno is set, which is fine in nearest rounding mode, but powf(0x1.7ac7cp+5, 23) is inf in upward rounding mode powf(-0x1.7ac7cp+5, 23) is -inf in downward rounding mode and the previous implementation did not set errno in these cases. The fix tries to avoid affecting the common code path or calling a function that may introduce a stack frame, so float arithmetics is used to check the rounding mode and the threshold is selected accordingly. [BZ #23961] * math/auto-libm-test-in: Add new test case. * math/auto-libm-test-out-pow: Regenerated. * sysdeps/ieee754/flt-32/e_powf.c (__powf): Fix overflow check. |
||
---|---|---|
.. | ||
e_acosf.c | ||
e_acoshf.c | ||
e_asinf.c | ||
e_atan2f.c | ||
e_atanhf.c | ||
e_coshf.c | ||
e_exp2f_data.c | ||
e_exp2f.c | ||
e_expf.c | ||
e_fmodf.c | ||
e_gammaf_r.c | ||
e_hypotf.c | ||
e_ilogbf.c | ||
e_j0f.c | ||
e_j1f.c | ||
e_jnf.c | ||
e_lgammaf_r.c | ||
e_log2f_data.c | ||
e_log2f.c | ||
e_log10f.c | ||
e_logf_data.c | ||
e_logf.c | ||
e_powf_log2_data.c | ||
e_powf.c | ||
e_remainderf.c | ||
e_sinhf.c | ||
e_sqrtf.c | ||
k_tanf.c | ||
lgamma_negf.c | ||
lgamma_productf.c | ||
math_config.h | ||
math_errf.c | ||
mpn2flt.c | ||
s_asinhf.c | ||
s_atanf.c | ||
s_cbrtf.c | ||
s_ceilf.c | ||
s_copysignf.c | ||
s_cosf.c | ||
s_erff.c | ||
s_expm1f.c | ||
s_fabsf.c | ||
s_finitef.c | ||
s_floorf.c | ||
s_fpclassifyf.c | ||
s_frexpf.c | ||
s_fromfpf_main.c | ||
s_fromfpf.c | ||
s_fromfpxf.c | ||
s_getpayloadf.c | ||
s_isinff.c | ||
s_isnanf.c | ||
s_issignalingf.c | ||
s_llrintf.c | ||
s_llroundf.c | ||
s_log1pf.c | ||
s_logbf.c | ||
s_lrintf.c | ||
s_lroundf.c | ||
s_modff.c | ||
s_nearbyintf.c | ||
s_nextafterf.c | ||
s_nextupf.c | ||
s_remquof.c | ||
s_rintf.c | ||
s_roundevenf.c | ||
s_roundf.c | ||
s_scalblnf.c | ||
s_scalbnf.c | ||
s_setpayloadf_main.c | ||
s_setpayloadf.c | ||
s_setpayloadsigf.c | ||
s_signbitf.c | ||
s_sincosf_data.c | ||
s_sincosf.c | ||
s_sincosf.h | ||
s_sinf.c | ||
s_tanf.c | ||
s_tanhf.c | ||
s_totalorderf.c | ||
s_totalordermagf.c | ||
s_truncf.c | ||
s_ufromfpf.c | ||
s_ufromfpxf.c | ||
w_exp2f.c | ||
w_expf.c | ||
w_log2f.c | ||
w_logf.c | ||
w_powf.c |