LibM: Implement fmin/fmax

This commit is contained in:
Mițca Dumitru 2021-03-15 17:27:13 +02:00 committed by Andreas Kling
parent 987cc904c2
commit 01a49dda85
Notes: sideshowbarker 2024-07-18 21:19:13 +09:00
3 changed files with 81 additions and 0 deletions

View file

@ -1364,4 +1364,64 @@ long double scalblnl(long double x, long exponent) NOEXCEPT
{
return internal_scalbn(x, exponent);
}
long double fmaxl(long double x, long double y) NOEXCEPT
{
if (isnan(x))
return y;
if (isnan(y))
return x;
return x > y ? x : y;
}
double fmax(double x, double y) NOEXCEPT
{
if (isnan(x))
return y;
if (isnan(y))
return x;
return x > y ? x : y;
}
float fmaxf(float x, float y) NOEXCEPT
{
if (isnan(x))
return y;
if (isnan(y))
return x;
return x > y ? x : y;
}
long double fminl(long double x, long double y) NOEXCEPT
{
if (isnan(x))
return y;
if (isnan(y))
return x;
return x < y ? x : y;
}
double fmin(double x, double y) NOEXCEPT
{
if (isnan(x))
return y;
if (isnan(y))
return x;
return x < y ? x : y;
}
float fminf(float x, float y) NOEXCEPT
{
if (isnan(x))
return y;
if (isnan(y))
return x;
return x < y ? x : y;
}
}

View file

@ -107,6 +107,12 @@ float fabsf(float) NOEXCEPT;
long double fmodl(long double, long double) NOEXCEPT;
double fmod(double, double) NOEXCEPT;
float fmodf(float, float) NOEXCEPT;
long double fmaxl(long double, long double) NOEXCEPT;
double fmax(double, double) NOEXCEPT;
float fmaxf(float, float) NOEXCEPT;
long double fminl(long double, long double) NOEXCEPT;
double fmin(double, double) NOEXCEPT;
float fminf(float, float) NOEXCEPT;
long double remainderl(long double, long double) NOEXCEPT;
double remainder(double, double) NOEXCEPT;
float remainderf(float, float) NOEXCEPT;

View file

@ -247,4 +247,19 @@ TEST_CASE(gamma)
EXPECT_EQ(signgam, -1);
}
TEST_CASE(fmax_and_fmin)
{
EXPECT(fmax(-INFINITY, 0) == 0);
EXPECT(fmax(NAN, 12) == 12);
EXPECT(fmax(5, NAN) == 5);
EXPECT(isnan(fmax(NAN, NAN)));
EXPECT(isinf(fmax(1'000'000, INFINITY)));
EXPECT(isinf(fmin(-INFINITY, 0)));
EXPECT(fmin(0, INFINITY) == 0);
EXPECT(fmin(NAN, 5) == 5);
EXPECT(fmin(0, NAN) == 0);
EXPECT(isnan(fmin(NAN, NAN)));
}
TEST_MAIN(Math)