assert_eq_float/lib.rs
1/*!
2# assert-eq-float
3
4This crate provides the `assert_eq_float!` macros that support floats.
5
6## Examples
7
8```rust
9use assert_eq_float::*;
10
11assert_eq_float!(1.1 + 0.1, 1.2); // error = 0.0000000000000021316282072803005
12assert_eq_float!(1e100 + 2e100, 3e100); // error = 53290705182007510000000000000000000000000000000000000000000000000000000000000000000000
13
14// other macros
15debug_assert_eq_float!(0.0, 0.0);
16assert_ne_float!(0.0, 0.1);
17debug_assert_ne_float!(0.0, 0.1);
18```
19
20The default margin of error is dynamically computed by properties of IEEE 754 floating point numbers. You don't need to worry about it if you just want to check two float values are **equal**.
21*/
22
23#![no_std]
24
25#[doc(hidden)]
26pub extern crate num_traits;
27
28mod eq;
29mod ne;
30
31use num_traits::float::FloatCore;
32
33#[doc(hidden)]
34#[inline]
35pub fn get_error<T: FloatCore>(a: T, b: T) -> T {
36 // See: https://magiclen.org/float-precision/
37 a.abs().min(b.abs()) * T::epsilon() * T::from(8).unwrap()
38}