diff --git a/libc/math/lib_ceil.c b/libc/math/lib_ceil.c index 329e20b24f..28ebf44f2f 100644 --- a/libc/math/lib_ceil.c +++ b/libc/math/lib_ceil.c @@ -41,8 +41,10 @@ #ifdef CONFIG_HAVE_DOUBLE double ceil(double x) { + double x1 = x; + modf(x, &x); - if (x > 0.0) + if (x1 > 0.0 && fabs(x1 - x) > 0.0) { x += 1.0; } diff --git a/libc/math/lib_ceilf.c b/libc/math/lib_ceilf.c index d9394bd8a1..e3af055202 100644 --- a/libc/math/lib_ceilf.c +++ b/libc/math/lib_ceilf.c @@ -37,8 +37,10 @@ float ceilf(float x) { + float x1 = x; + modff(x, &x); - if (x > 0.0F) + if (x1 > 0.0F && fabsf(x1 - x) > 0.0F) { x += 1.0F; } diff --git a/libc/math/lib_ceill.c b/libc/math/lib_ceill.c index 2e16ab73ad..14c665b5a4 100644 --- a/libc/math/lib_ceill.c +++ b/libc/math/lib_ceill.c @@ -41,8 +41,10 @@ #ifdef CONFIG_HAVE_LONG_DOUBLE long double ceill(long double x) { + long double x1 = x; + modfl(x, &x); - if (x > 0.0) + if (x1 > 0.0 && fabsl(x1 - x) > 0.0) { x += 1.0; }