@standardsx{fminfNx, TS 18661-3:2015, math.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{fmin} function returns the lesser of the two values @var{x}
-and @var{y}. It is similar to the expression
+and @var{y} respecting the order signed zeros. It is similar to the
+expression
@smallexample
-((x) < (y) ? (x) : (y))
+if (x == y)
+ return signbit (x) ? x : y;
+return ((x) < (y) ? (x) : (y))
@end smallexample
except that @var{x} and @var{y} are only evaluated once.
{
TEST_ff_f (fmax, 0, 0, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (fmax, minus_zero, minus_zero, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
- TEST_ff_f (fmax, 0, minus_zero, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|IGNORE_ZERO_INF_SIGN),
- TEST_ff_f (fmax, minus_zero, 0, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|IGNORE_ZERO_INF_SIGN),
+ /* The order signed zeros are implemented as a QoI in the generic implementation
+ and expected for USE_F{MIN,MAX}{F,L,F128}_BUILTIN. */
+ TEST_ff_f (fmax, 0, minus_zero, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+ TEST_ff_f (fmax, minus_zero, 0, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (fmax, min_subnorm_value, -min_subnorm_value, min_subnorm_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (fmax, -min_subnorm_value, min_subnorm_value, min_subnorm_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (fmax, min_value, -min_value, min_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
{
TEST_ff_f (fmin, 0, 0, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (fmin, minus_zero, minus_zero, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
- TEST_ff_f (fmin, 0, minus_zero, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|IGNORE_ZERO_INF_SIGN),
- TEST_ff_f (fmin, minus_zero, 0, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|IGNORE_ZERO_INF_SIGN),
+ /* The order signed zeros are implemented as a QoI in the generic implementation
+ and expected for USE_F{MIN,MAX}{F,L,F128}_BUILTIN. */
+ TEST_ff_f (fmin, 0, minus_zero, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+ TEST_ff_f (fmin, minus_zero, 0, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (fmin, min_subnorm_value, -min_subnorm_value, -min_subnorm_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (fmin, -min_subnorm_value, min_subnorm_value, -min_subnorm_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (fmin, min_value, -min_value, -min_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
return M_SUF (__builtin_fmax) (x, y);
#else
if (__glibc_likely (!isunordered (x, y)))
- return x > y ? x : y;
+ {
+ if (__glibc_unlikely (x == y))
+ return signbit (x) ? y : x;
+ return x > y ? x : y;
+ }
else if (issignaling (x) || issignaling (y))
return x + y;
else
return M_SUF (__builtin_fmin) (x, y);
#else
if (__glibc_likely (!isunordered (x, y)))
- return x > y ? y : x;
+ {
+ if (__glibc_unlikely (x == y))
+ return signbit (x) ? x : y;
+ return x > y ? y : x;
+ }
else if (issignaling (x) || issignaling (y))
return x + y;
else