#[no_mangle]
pub fn rint(x: f64) -> f64 {
let u = asuint64(x);
let e = ((u >> 52) & 0x7ff) as i32;
let s = u >> 63;
if e >= 0x3ff + 52 {
return x;
}
let toint = 4503599627370496.0f64;
let y = if s != 0 {
x - toint + toint
} else {
x + toint - toint
};
if y == 0.0 {
if s != 0 { -0.0 } else { 0.0 }
} else {
y
}
}
#[no_mangle]
pub fn rintf(x: f32) -> f32 {
let u = asuint(x);
let e = ((u >> 23) & 0xff) as i32;
let s = u >> 31;
if e >= 0x7f + 23 {
return x;
}
let toint = 8388608.0f32;
let y = if s != 0 {
x - toint + toint
} else {
x + toint - toint
};
if y == 0.0 {
if s != 0 { -0.0f32 } else { 0.0f32 }
} else {
y
}
}
#[no_mangle]
pub extern "C" fn lrint(x: f64) -> c_long {
rint(x) as c_long
}
#[no_mangle]
pub extern "C" fn llrint(x: f64) -> c_longlong {
rint(x) as c_longlong
}
#[no_mangle]
pub extern "C" fn lrintf(x: f32) -> c_long {
rintf(x) as c_long
}
#[no_mangle]
pub extern "C" fn llrintf(x: f32) -> c_longlong {
rintf(x) as c_longlong
}
#[cfg(target_arch = "x86_64")]
#[no_mangle]
pub extern "C" fn lrintl(x: f64) -> c_long {
lrint(x)
}
#[cfg(target_arch = "x86_64")]
#[no_mangle]
pub extern "C" fn llrintl(x: f64) -> c_longlong {
llrint(x)
}
#[cfg(target_arch = "aarch64")]
#[no_mangle]
pub extern "C" fn lrintl(x: f128) -> c_long {
lrint(x as f64)
}
#[cfg(target_arch = "aarch64")]
#[no_mangle]
pub extern "C" fn llrintl(x: f128) -> c_longlong {
llrint(x as f64)
}
#[cfg(target_arch = "riscv64")]
#[no_mangle]
pub extern "C" fn lrintl(x: f128) -> c_long {
lrint(x as f64)
}
#[cfg(target_arch = "riscv64")]
#[no_mangle]
pub extern "C" fn llrintl(x: f128) -> c_longlong {
llrint(x as f64)
}