diff --git a/libc/math/lib_ceil.c b/libc/math/lib_ceil.c index 329e20b24ff..28ebf44f2fc 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 d9394bd8a17..e3af055202e 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 2e16ab73add..14c665b5a4c 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; } diff --git a/libc/math/lib_modf.c b/libc/math/lib_modf.c index 5782ebf010b..1c1b8ffcf54 100644 --- a/libc/math/lib_modf.c +++ b/libc/math/lib_modf.c @@ -46,7 +46,7 @@ double modf(double x, double *iptr) } else if (fabs(x) < 1.0) { - *iptr = 0.0; + *iptr = (x * 0.0); return x; } else diff --git a/libc/math/lib_modff.c b/libc/math/lib_modff.c index 5c88ff83f28..c6fac3fc5cb 100644 --- a/libc/math/lib_modff.c +++ b/libc/math/lib_modff.c @@ -44,7 +44,7 @@ float modff(float x, float *iptr) } else if (fabsf(x) < 1.0F) { - *iptr = 0.0F; + *iptr = (x * 0.0F); return x; } else diff --git a/libc/math/lib_modfl.c b/libc/math/lib_modfl.c index 67399845279..e55f4491718 100644 --- a/libc/math/lib_modfl.c +++ b/libc/math/lib_modfl.c @@ -49,7 +49,7 @@ long double modfl(long double x, long double *iptr) } else if (fabs(x) < 1.0) { - *iptr = 0.0; + *iptr = (x * 0.0); return x; } else