/** * This file has no copyright assigned and is placed in the Public Domain. * This file is part of the mingw-w64 runtime package. * No warranty is given; refer to the file DISCLAIMER.PD within this package. */ #include #include long long llrintf (float x) { long long retval = 0ll; #if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__) __asm__ __volatile__ ("fistpll %0" : "=m" (retval) : "t" (x) : "st"); #else int mode = fegetround(); if (mode == FE_DOWNWARD) retval = (long long)floorf(x); else if (mode == FE_UPWARD) retval = (long long)ceilf(x); else if (mode == FE_TOWARDZERO) retval = x >= 0 ? (long long)floorf(x) : (long long)ceilf(x); else { // Break `x` into integral and fractional parts. float intg, frac; frac = modff(x, &intg); frac = fabsf(frac); // Convert the truncated integral part to an integer. retval = intg; if (frac < 0.5) { // Round towards zero. } else if (frac > 0.5) { // Round towards infinities. retval += signbit(x) ? -1 : 1; } else { // Round to the nearest even number. retval += retval % 2; } } #endif return retval; }