ballpark 1.0.0

Approximate comparisons for floating-point numbers
Documentation
# *Ballpark* – Approximate Comparisons

This crate provides approximate equality comparisons and assertions for
floating-point values.

```rust
use ballpark::assert_approx_eq;

// Infamously, 0.1 + 0.2 == 0.30000000000000004 when using double precision.
assert_ne!(0.1 + 0.2, 0.3);

// But they are *approximately* equal.
assert_approx_eq!(0.1 + 0.2, 0.3);

// In fact, the result is within one unit in the last place (ULP) of the correct one:
assert_approx_eq!(0.1 + 0.2, 0.3).ulps(1);
```

Refer to the [API Documentation] for more examples like these.

[API Documentation]: https://docs.rs/ballpark

## Features

- Lightweight: no mandatory dependencies, fast compiles by default.
- Stable: 1.0, no breaking changes planned, no unstable public dependencies.
- Ergonomic: familiar syntax with good IDE support.
- Flexible: `#![no_std]` support, no `alloc` needed (just disable the default features).

## Non-Features

This crate does ***not*** aim to provide the following features:

- Comparing integers.
  - If the integers are converted from floats, try to keep the data as floats instead.
  - Converting the integers to floats and operating on those can also be a useful solution.
  - Otherwise, some domain-specific solution is needed, and this crate would likely not help anyways.
- Approximate comparison of image data, or other data subject to perceptive biases.
  - You *can* use this library as long as the data consists of floats or can be reinterpreted as such, but a domain-specific algorithm will likely be more useful.
  - For image data, you can use a perceptual comparison algorithm like [ꟻLIP] instead.
  - For audio data, computing the SNR and asserting that the noise is inaudible is a good starting point.
- Implementations for types from third-party crates.
  - This crate only enables approximate comparisons for types in the core language and standard library.
  - Instead, external crates should depend on `ballpark` themselves and provide their own implementations (potentially behind a Cargo feature).
  - This avoids adding potentially dozens of optional unstable dependencies to this crate and pushing all the maintenance burden on me.

[ꟻLIP]: https://github.com/gfx-rs/nv-flip-rs

## Rust Support

This library targets the latest Rust version.

Older Rust versions are supported by equally older versions of this crate. For example, to use a
version of Rust that was succeeded 6 months ago, you'd also use an at least 6 month old version of
this library.

Compatibility with older Rust versions may be provided on a best-effort basis.