inari 1.1.0

A Rust implementation of interval arithmetic
Documentation
# Changelog

Items marked with ⚠️ are breaking changes.

## v1.1.0 - 2023-04-02

### Added

- Implemented `(Dec)Interval::mul_rev_to_pair`.

### Changed

- ⚠️ Bumped the minimum supported Rust version to 1.65.0.
- ⚠️ Updated the following dependencies:
  - `gmp-mpfr-sys` from 1.4 to 1.5.
  - `rug` from 1.11 to 1.19.

## v1.0.0 - 2022-07-09

### Changed

- ⚠️ Bumped the minimum supported Rust version to 1.61.0.

### Removed

- ⚠️ Removed the macro `interval!(s, exact)`.

  Use the macro `interval_exact!(s)` [introduced]#v0140---2022-02-11 in v0.14.0 instead. (The removal should have been made in that version.)

## v0.15.0 - 2022-04-03

This is the first version of the crate that covers all required operations of IEEE Std 1788.1-2017.

### Added

- Implemented `(Dec)Interval::cancel_minus` and `cancel_plus`.

## v0.14.0 - 2022-02-11

### Changed

- ⚠️ Revised the syntax of the macro `interval!(s, exact)` to `interval_exact!(s)`.

## v0.13.0 - 2022-02-09

### Changed

- ⚠️ Renamed `(Dec)Interval::pown` to `(Dec)Interval::powi` so that it matches with the standard method `f64::powi`.

### Added

- Implemented the standard arithmetic operators `std::ops::{Neg, Add, Sub, Mul, Div}` and the corresponding assignment operators `std::ops::{AddAssign, SubAssign, MulAssign, DivAssign}` for `(Dec)Interval` for the cases when one or both of the arguments are given by reference.

## v0.12.0 - 2021-12-16

The crate requires a nightly toolchain >= `nightly-2021-12-16`.

### Fixed

- Fixed build failure on the latest nightly toolchain.

## v0.11.0 - 2021-12-07

The crate requires a nightly toolchain >= `nightly-2021-10-05`.

### Fixed

- Downstream crates are no longer required to specify the `static_assertions` crate as their dependency.

## v0.10.9 - 2021-10-10

- Now inari supports `x86_64-pc-windows-gnu` as a target.

## v0.10.0 - 2021-06-30

### Added

- Implemented the trait `Hash` for `Interval`, `Decoration` and `Overlap`.

### Removed

- ⚠️ Removed the method `IntervalError::value`.

  Previously, the following values were returned by the method:

  | `err.kind()`                                    | `err.value()`                           |
  | ----------------------------------------------- | --------------------------------------- |
  | `IntervalErrorKind::UndefinedOperation`         | `Interval::EMPTY` or `DecInterval::NAI` |
  | `IntervalErrorKind::PossiblyUndefinedOperation` | `(Dec)Interval::ENTIRE`                 |

### Changed

- ⚠️ Changed the return type of the functions `(Dec)Interval::try_from_be_bytes`, `try_from_le_bytes` and `try_from_ne_bytes` to `Option<(Dec)Interval>`.
- ⚠️ Changed the struct `IntervalError` to be non-generic due to the removal of the `value` method.

## v0.9.9 - 2021-06-18

### Fixed

- Fixed the macros `interval!(s)` and `dec_interval!(s)` to return an `Err` with `IntervalErrorKind::PossiblyUndefinedOperation` when the mantissa has too many digits after the decimal point.

## v0.9.8 - 2021-06-06

### Fixed

- Fixed build failure with the latest nightly rust compiler: `rustc 1.54.0-nightly (6c2dd251b 2021-06-05)`.

## v0.9.4 - 2021-05-09

### Fixed

- Fixed the functions `(Dec)Interval::try_from_be_bytes`, `try_from_le_bytes` and `try_from_ne_bytes` to correctly deserialize the empty interval.

## v0.9.2 - 2021-03-09

### Added

- Experimental support for AArch64.

## v0.9.0 - 2021-02-20

### Changed

- ⚠️ Explicitly check the target CPU features during compilation. From this version, you need to specify `RUSTFLAGS='-Ctarget-cpu=<CPU>'`, where `<CPU>` must be `haswell` or a newer microarchitecture; otherwise, build fails.

## v0.8.0 - 2020-11-24

### Added

- Experimental support for AVX-512F.
  - To try it out, run cargo with `RUSTFLAGS='-Ctarget-feature=+avx512f'`.
  - Basic arithmetic operations are expected to get faster, but it is not benchmarked yet.

### Removed

- ⚠️ Removed the enum variant `IntervalErrorKind::IntvlPartOfNaI`.

### Changed

- ⚠️ Renamed the method `(Dec)Interval::round_ties_to_away` to `round`.
- ⚠️ Renamed the methods `DecInterval::interval_part` and `decoration_part` to `interval` and `decoration`, respectively.
- ⚠️ Changed the return type of the method `DecInterval::interval` (former `interval_part`) to `Option<Interval>` from `Result<Interval>`.
- ⚠️ Renamed the enum `OverlappingState` to `Overlap`.

## v0.7.0 - 2020-11-14

### Changed

- ⚠️ Renamed `DecoratedInterval` to `DecInterval`. Now its name is consistent with the macro `(const_)dec_interval!`.

## v0.6.1 - 2020-09-25

### Fixed

- Fixed the build failure on docs.rs.

## v0.6.0 - 2020-09-24

### Added

- Implemented the trait `Eq` for the enum `OverlappingState`.

### Removed

- ⚠️ Removed the enum variant `OverlappingState::Undefined`.

### Changed

- ⚠️ Changed the return type of the method `DecoratedInterval::overlap` to `Option<OverlappingState>` from `OverlappingState`.
  - Now it returns `None` if at least one of its arguments is NaI.
- ⚠️ Renamed the enum variant `OverlappingState::Equal` to `Equals`.

## v0.5.1 - 2020-08-31

### Fixed

- Fixed the macro `const_dec_interval!` to be usable without importing the macro `const_interval!`.

## v0.5.0 - 2020-08-31

### Changed

- ⚠️ Renamed the method `(Decorated)Interval::log` to `ln` to make them consistent with `f64::ln`.

## v0.4.0 - 2020-08-25

### Added

- Added type conversions between intervals and byte arrays.
  - `(Decorated)Interval::to_be_bytes`, `to_le_bytes` and `to_ne_bytes` convert intervals into byte arrays.
  - `(Decorated)Interval::try_from_be_bytes`, `try_from_le_bytes` and `try_from_ne_bytes` convert byte arrays into intervals.
- Added the type alias `Result<T> = std::result::Result<T, IntervalError<T>>`.

### Fixed

- Fixed the decoration returned by `atan2`.
  - Previously, `Def` was returned instead of `Dac` in certain cases.
- Fixed the Clippy warning `double_neg` caused by passing a negative value as the lower bound to the macro `const_interval!`.

## v0.3.1 - 2020-08-14

### Fixed

- Fixed decorations returned by constructors of `DecoratedInterval` and elementary functions `acos`, `acosh`, `asin`, `atan2`, `atanh`, `log`, `log2`, `log10` and `pow`.
  - `atan2` is still under investigation. so use it with caution.
  - Fixed broken unit tests.

## v0.3.0 - 2020-08-03

### Added

- Added the elementary functions `(Decorated)Interval::pown`, `pow`, `exp`, `exp2`, `exp10`, `log`, `log2`, `log10`, `sin`, `cos`, `tan`, `asin`, `acos`, `atan`, `atan2`, `sinh`, `cosh`, `tanh`, `asinh`, `acosh` and `atanh`.

- Added the macros `const_interval!` and `const_dec_interval!` which let you make intervals from `f64` numbers in const contexts.

- Added the constants `(Decorated)Interval::EMPTY`, `ENTIRE` and `DecoratedInterval::NAI`.

### Removed

- ⚠️ Removed the functions `(Decorated)Interval::empty`, `entire` and `DecoratedInterval::nai` in favor of the new constants.

### Changed

- ⚠️ Changeed the representation of the struct `DecoratedInterval` to `#[repr(C)]` from the default one, while users must not rely on it.

## v0.2.1 - 2020-07-17

### Fixed

- Fixed the methods `Interval::rad` and `wid` to round the results up.

## v0.2.0 - 2020-07-09

### Added

- Added the decoration system.
  - Added the struct `DecoratedInterval`.
  - Added the macro `dec_interval!` that constructs a decorated interval.
  - Added the enum `Decoration`.
  - ⚠️ Added the enum variant `IntervalErrorKind::IntvlPartOfNaI`.
  - ⚠️ Added the enum variant `OverlappingState::Undefined`.
- Added the macro rule `interval!("...", exact)` that constructs an interval from an exact interval literal (`exactToInterval` in the standard).

### Changed

- ⚠️ Renamed the function `Interval::is_member` to `contains` and swapped the order of parameters to make it a method.
- ⚠️ Changed the method `IntervalError<T>::value` to take `self` instead of `&self`.

## v0.1.0 - 2020-07-03

Initial release.