Trait float_next_after::NextAfter
source · pub trait NextAfter<T: Float> {
// Required method
fn next_after(self, y: T) -> T;
}
Expand description
Returns the next representable float value in the direction of y
This function is strict and will step to the very next representable floating point, even if that value is subnormal.
Base assumptions:
self == y -> return y
self >= positive infinity -> return positive infinity
self <= negative infinity -> return negative infinity
self == NaN -> return NaN
self == -0.0 and y == 0.0 -> return positive 0.0
self == -0.0 and y == positive infinity -> 5e-324
Examples
use float_next_after::NextAfter;
// Large numbers
let big_num = 16237485966.00000437586943_f64;
let next = big_num.next_after(std::f64::INFINITY);
assert_eq!(next, 16237485966.000006_f64);
// Expected handling of 1.0
let one = 1_f64;
let next = one.next_after(std::f64::INFINITY);
assert_eq!(next, 1_f64 + std::f64::EPSILON);
// Tiny (negative) numbers
let zero = 0_f32;
let next = zero.next_after(std::f32::NEG_INFINITY);
assert_eq!(next, -0.000000000000000000000000000000000000000000001_f32);
// Equal source/dest (even -0 == 0)
let zero = 0_f64;
let next = zero.next_after(-0_f64);
assert_eq!(next, -0_f64);
Safety
This trait uses the ToBits and FromBits functions from f32 and f64. Those both use unsafe { mem::transmute(self) } / unsafe { mem::transmute(v) } to convert a f32/f64 to u32/u64. The docs for those functions claim they are safe and that “the safety issues with sNaN were overblown!”