소스 검색

LibM: Implement fmin/fmax

Mițca Dumitru 4 년 전
부모
커밋
01a49dda85
3개의 변경된 파일81개의 추가작업 그리고 0개의 파일을 삭제
  1. 60 0
      Userland/Libraries/LibM/math.cpp
  2. 6 0
      Userland/Libraries/LibM/math.h
  3. 15 0
      Userland/Tests/LibM/test-math.cpp

+ 60 - 0
Userland/Libraries/LibM/math.cpp

@@ -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;
+}
 }

+ 6 - 0
Userland/Libraries/LibM/math.h

@@ -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;

+ 15 - 0
Userland/Tests/LibM/test-math.cpp

@@ -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)