2019-01-26 13:02:58 -08:00
|
|
|
|
<!-- Copyright © 2018–2019 Trevor Spiteri -->
|
2018-08-09 11:02:34 -07:00
|
|
|
|
|
|
|
|
|
<!-- Copying and distribution of this file, with or without
|
|
|
|
|
modification, are permitted in any medium without royalty provided the
|
|
|
|
|
copyright notice and this notice are preserved. This file is offered
|
|
|
|
|
as-is, without any warranty. -->
|
|
|
|
|
|
|
|
|
|
# Fixed-point numbers
|
|
|
|
|
|
2018-08-10 11:30:03 -07:00
|
|
|
|
The [*fixed* crate] provides fixed-point numbers. Currently it uses
|
|
|
|
|
the [*typenum* crate] for the fractional bit count; it is planned to
|
|
|
|
|
move to [const generics] when they are implemented by the Rust
|
2018-08-10 08:45:08 -07:00
|
|
|
|
compiler.
|
2018-08-09 11:02:34 -07:00
|
|
|
|
|
2018-08-10 11:43:53 -07:00
|
|
|
|
The crate provides the following types:
|
|
|
|
|
|
|
|
|
|
* [`FixedI8`] is a signed eight-bit fixed-point number,
|
|
|
|
|
* [`FixedI16`] is a signed 16-bit fixed-point number,
|
|
|
|
|
* [`FixedI32`] is a signed 32-bit fixed-point number,
|
|
|
|
|
* [`FixedI64`] is a signed 64-bit fixed-point number,
|
|
|
|
|
* [`FixedI128`] is a signed 128-bit fixed-point number,
|
|
|
|
|
* [`FixedU8`] is an unsigned eight-bit fixed-point number,
|
|
|
|
|
* [`FixedU16`] is an unsigned 16-bit fixed-point number,
|
|
|
|
|
* [`FixedU32`] is an unsigned 32-bit fixed-point number,
|
|
|
|
|
* [`FixedU64`] is an unsigned 64-bit fixed-point number, and
|
|
|
|
|
* [`FixedU128`] is an unsigned 128-bit fixed-point number.
|
|
|
|
|
|
|
|
|
|
All fixed-point numbers can have `Frac` fractional bits, where `Frac`
|
|
|
|
|
can have any value from 0 up to and including the size of the number
|
|
|
|
|
in bits. When `Frac` is 0, the fixed-point number behaves like an
|
|
|
|
|
integer. When `Frac` is equal to the number of bits, the value of the
|
|
|
|
|
fixed-point number lies in the range −0.5 ≤ *x* < 0.5 for signed
|
|
|
|
|
fixed-point numbers, and in the range 0 ≤ *x* < 1 for unsigned
|
|
|
|
|
fixed-point numbers.
|
2018-08-10 02:13:42 -07:00
|
|
|
|
|
2019-08-08 14:25:05 -07:00
|
|
|
|
Various conversion methods are available:
|
|
|
|
|
|
|
|
|
|
* All lossless infallible conversions between fixed-point numbers
|
2019-08-20 07:42:37 -07:00
|
|
|
|
and numeric primitives are implemented. You can use [`From`] or
|
|
|
|
|
[`Into`] for conversions that always work without losing any bits.
|
|
|
|
|
* For lossy infallible conversions between fixed-point numbers and
|
|
|
|
|
numeric primitives, where the source type may have more fractional
|
|
|
|
|
bits than the destination type, the [`LossyFrom`] and
|
|
|
|
|
[`LossyInto`] traits can be used. Excess fractional bits are
|
|
|
|
|
truncated.
|
|
|
|
|
* Checked conversions are provided between fixed-point numbers and
|
|
|
|
|
numeric primitives using the [`FromFixed`] and [`ToFixed`] traits,
|
2019-08-20 10:40:53 -07:00
|
|
|
|
or using the [`from_num`] and [`to_num`] methods and their checked
|
|
|
|
|
versions.
|
2019-08-20 07:42:37 -07:00
|
|
|
|
* Fixed-point numbers can be parsed from decimal strings using
|
|
|
|
|
[`FromStr`], or from binary, octal or hexadecimal using the
|
|
|
|
|
[`from_str_binary`], [`from_str_octal`] or [`from_str_hex`]
|
2019-08-20 10:40:53 -07:00
|
|
|
|
methods. The result is rounded to the nearest, with ties rounded
|
|
|
|
|
to even.
|
2019-08-20 07:42:37 -07:00
|
|
|
|
* Fixed-point numbers can be converted to strings using [`Display`],
|
|
|
|
|
[`Binary`], [`Octal`], [`LowerHex`] and [`UpperHex`]. The output
|
2019-08-20 10:40:53 -07:00
|
|
|
|
is rounded to the nearest, with ties rounded to even.
|
2019-01-26 12:16:20 -08:00
|
|
|
|
|
2018-08-10 11:57:59 -07:00
|
|
|
|
## What’s new
|
|
|
|
|
|
2019-08-20 10:40:53 -07:00
|
|
|
|
### Version 0.4.3 news (2019-08-20)
|
2019-08-17 07:45:09 -07:00
|
|
|
|
|
2019-08-17 07:51:40 -07:00
|
|
|
|
* The [*fixed* crate] now requires rustc version 1.34.0 or later.
|
2019-08-20 10:40:53 -07:00
|
|
|
|
* The precision argument is no longer ignored when formatting
|
|
|
|
|
fixed-point numbers; precision should now be handled the same as
|
|
|
|
|
for primitive floating-point numbers in the standard library.
|
|
|
|
|
* Parsing strings now rounds to the nearest with ties rounded to
|
|
|
|
|
even.
|
2019-08-18 15:30:02 -07:00
|
|
|
|
* Checked versions of string parsing methods are now available as
|
2019-08-18 16:16:53 -07:00
|
|
|
|
inherent methods to all fixed-point numbers, and as methods in the
|
|
|
|
|
[`Fixed`] trait.
|
|
|
|
|
* [`Wrapping`] now has methods for parsing with wrapping, including
|
|
|
|
|
an implementation of [`FromStr`].
|
2019-08-17 07:45:09 -07:00
|
|
|
|
* The following methods are now `const` functions:
|
2019-08-17 08:10:55 -07:00
|
|
|
|
* [`min_value`], [`max_value`], [`from_bits`], [`to_bits`]
|
|
|
|
|
* [`count_ones`], [`count_zeros`], [`leading_zeros`],
|
|
|
|
|
[`trailing_zeros`] [`rotate_left`], [`rotate_right`]
|
|
|
|
|
* [`wrapping_neg`], [`wrapping_add`], [`wrapping_sub`],
|
|
|
|
|
[`wrapping_mul_int`], [`wrapping_shl`], [`wrapping_shr`]
|
|
|
|
|
* [`overflowing_neg`], [`overflowing_add`], [`overflowing_sub`],
|
|
|
|
|
[`overflowing_mul_int`], [`overflowing_shl`],
|
|
|
|
|
[`overflowing_shr`]
|
|
|
|
|
* [`is_positive`], [`is_negative`]
|
2019-08-17 08:55:50 -07:00
|
|
|
|
* The associated constants [`INT_NBITS`] and [`FRAC_NBITS`] were added.
|
2019-08-20 10:40:53 -07:00
|
|
|
|
* The reexports in the `frac` module and the `LeEqU*` traits were
|
|
|
|
|
moved into the new [`types::extra`] module.
|
|
|
|
|
|
|
|
|
|
[`FRAC_NBITS`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#associatedconstant.FRAC_NBITS
|
|
|
|
|
[`Fixed`]: https://docs.rs/fixed/0.4.3/fixed/traits/trait.Fixed.html
|
|
|
|
|
[`INT_NBITS`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#associatedconstant.INT_NBITS
|
|
|
|
|
[`Wrapping`]: https://docs.rs/fixed/0.4.3/fixed/struct.Wrapping.html
|
|
|
|
|
[`count_ones`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.count_ones
|
|
|
|
|
[`count_zeros`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.count_zeros
|
|
|
|
|
[`from_bits`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.from_bits
|
|
|
|
|
[`is_negative`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.is_negative
|
|
|
|
|
[`is_positive`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.is_positive
|
|
|
|
|
[`leading_zeros`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.leading_zeros
|
|
|
|
|
[`max_value`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.max_value
|
|
|
|
|
[`min_value`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.min_value
|
|
|
|
|
[`overflowing_add`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.overflowing_add
|
|
|
|
|
[`overflowing_mul_int`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.overflowing_mul_int
|
|
|
|
|
[`overflowing_neg`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.overflowing_neg
|
|
|
|
|
[`overflowing_shl`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.overflowing_shl
|
|
|
|
|
[`overflowing_shr`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.overflowing_shr
|
|
|
|
|
[`overflowing_sub`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.overflowing_sub
|
|
|
|
|
[`rotate_left`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.rotate_left
|
|
|
|
|
[`rotate_right`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.rotate_right
|
|
|
|
|
[`to_bits`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.to_bits
|
|
|
|
|
[`trailing_zeros`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.trailing_zeros
|
|
|
|
|
[`types::extra`]: https://docs.rs/fixed/0.4.3/fixed/types/extra/index.html
|
|
|
|
|
[`wrapping_add`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.wrapping_add
|
|
|
|
|
[`wrapping_mul_int`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.wrapping_mul_int
|
|
|
|
|
[`wrapping_neg`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.wrapping_neg
|
|
|
|
|
[`wrapping_shl`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.wrapping_shl
|
|
|
|
|
[`wrapping_shr`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.wrapping_shr
|
|
|
|
|
[`wrapping_sub`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.wrapping_sub
|
2019-08-17 07:45:09 -07:00
|
|
|
|
|
2019-08-16 14:25:19 -07:00
|
|
|
|
### Version 0.4.2 news (2019-08-16)
|
2019-08-13 10:01:01 -07:00
|
|
|
|
|
add {from,to}_num, deprecate sealed::{Int,Float,Fixed}
* new methods from_num, to_num, and their checked versions
* deprecate all other from_* and to_*, except for the FromFixed and
ToFixed traits
* deprecate sealed::{Fixed,Int,Float}
* removed SealedFixed, replace Sealed{Int,Float} with
{Int,Float}Helper
2019-08-16 06:45:26 -07:00
|
|
|
|
* The new methods [`from_num`] and [`to_num`] together with their
|
|
|
|
|
checked versions were added to all fixed-point numbers.
|
|
|
|
|
* The methods `from_fixed`, `to_fixed`, `from_int`, `to_int`,
|
|
|
|
|
`from_float`, and `to_float`, and their checked versions, were
|
|
|
|
|
deprecated.
|
|
|
|
|
* The new method [`from_num`][`Wrapping::from_num`] was added to the
|
|
|
|
|
[`Wrapping`] wrapper.
|
2019-08-13 10:01:01 -07:00
|
|
|
|
* Bug fix: parsing of decimal fractions was fixed to give correctly
|
|
|
|
|
rounded results for long decimal fraction strings, for example
|
|
|
|
|
with four fractional bits, 0.96874999… (just below 31⁄32) and
|
|
|
|
|
0.96875 (31⁄32) are now parsed correctly as 0.9375 (15⁄16) and 1.0.
|
|
|
|
|
|
2019-08-20 10:40:53 -07:00
|
|
|
|
[`Wrapping::from_num`]: https://docs.rs/fixed/0.4.3/fixed/struct.Wrapping.html#method.from_num
|
|
|
|
|
[`Wrapping`]: https://docs.rs/fixed/0.4.3/fixed/struct.Wrapping.html
|
2019-08-15 05:38:27 -07:00
|
|
|
|
|
2019-08-12 04:20:13 -07:00
|
|
|
|
### Version 0.4.1 news (2019-08-12)
|
2019-08-09 13:38:09 -07:00
|
|
|
|
|
|
|
|
|
* All fixed-point types now implement [`FromStr`].
|
2019-08-10 10:14:15 -07:00
|
|
|
|
* The methods [`from_str_binary`], [`from_str_octal`] and
|
|
|
|
|
[`from_str_hex`] were added.
|
2019-08-09 13:38:09 -07:00
|
|
|
|
|
2019-08-08 14:25:05 -07:00
|
|
|
|
### Version 0.4.0 news (2019-08-08)
|
2019-08-02 06:40:22 -07:00
|
|
|
|
|
2019-08-08 14:25:05 -07:00
|
|
|
|
* The [*fixed* crate] now requires rustc version 1.31.0 or later.
|
2019-08-06 05:14:15 -07:00
|
|
|
|
* The [`traits`] module was added, with its traits [`Fixed`],
|
2019-08-06 07:43:39 -07:00
|
|
|
|
[`FixedSigned`], [`FixedUnsigned`], [`FromFixed`], [`ToFixed`],
|
2019-08-06 12:56:47 -07:00
|
|
|
|
[`LossyFrom`] and [`LossyInto`].
|
2019-08-06 07:35:58 -07:00
|
|
|
|
* The [`saturating_neg`] method was added to all fixed-point
|
|
|
|
|
numbers, and the [`saturating_abs`] method was added to signed
|
|
|
|
|
fixed-point numbers.
|
2019-08-06 09:53:41 -07:00
|
|
|
|
* The [`consts`] module was added.
|
2019-08-08 14:25:05 -07:00
|
|
|
|
* The [`signum`] method now wraps instead of panics in release mode.
|
2019-08-02 10:01:46 -07:00
|
|
|
|
|
|
|
|
|
#### Incompatible changes
|
|
|
|
|
|
|
|
|
|
* The sealed traits [`Int`] and [`Float`] now have no provided
|
2019-08-06 05:14:15 -07:00
|
|
|
|
methods; the methods in the old implementation are new provided by
|
2019-08-02 10:01:46 -07:00
|
|
|
|
[`FromFixed`] and [`ToFixed`].
|
2019-08-08 13:47:49 -07:00
|
|
|
|
* Deprecated methods were removed.
|
2019-08-02 06:40:22 -07:00
|
|
|
|
|
2019-08-08 14:25:05 -07:00
|
|
|
|
#### Contributors
|
|
|
|
|
|
|
|
|
|
* [@jean-airoldie](https://gitlab.com/jean-airoldie)
|
|
|
|
|
* [@tspiteri](https://gitlab.com/tspiteri)
|
|
|
|
|
|
2019-08-20 10:40:53 -07:00
|
|
|
|
[`FixedSigned`]: https://docs.rs/fixed/0.4.3/fixed/traits/trait.FixedSigned.html
|
|
|
|
|
[`FixedUnsigned`]: https://docs.rs/fixed/0.4.3/fixed/traits/trait.FixedUnsigned.html
|
|
|
|
|
[`Fixed`]: https://docs.rs/fixed/0.4.3/fixed/traits/trait.Fixed.html
|
|
|
|
|
[`Float`]: https://docs.rs/fixed/0.4.3/fixed/sealed/trait.Float.html
|
|
|
|
|
[`Int`]: https://docs.rs/fixed/0.4.3/fixed/sealed/trait.Int.html
|
|
|
|
|
[`consts`]: https://docs.rs/fixed/0.4.3/fixed/consts/index.html
|
|
|
|
|
[`saturating_abs`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.saturating_abs
|
|
|
|
|
[`saturating_neg`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.saturating_neg
|
|
|
|
|
[`signum`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.signum
|
|
|
|
|
[`traits`]: https://docs.rs/fixed/0.4.3/fixed/traits/index.html
|
2019-06-27 14:31:34 -07:00
|
|
|
|
|
2018-08-10 11:57:59 -07:00
|
|
|
|
### Other releases
|
|
|
|
|
|
|
|
|
|
Details on other releases can be found in [*RELEASES.md*].
|
|
|
|
|
|
|
|
|
|
[*RELEASES.md*]: https://gitlab.com/tspiteri/fixed/blob/master/RELEASES.md
|
|
|
|
|
|
2019-01-29 12:55:58 -08:00
|
|
|
|
## Quick examples
|
2018-08-11 08:33:31 -07:00
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
// 20 integer bits, 12 fractional bits
|
2019-01-26 13:22:18 -08:00
|
|
|
|
use fixed::types::I20F12;
|
|
|
|
|
|
2018-08-11 08:49:36 -07:00
|
|
|
|
// 19/3 = 6 1/3
|
2019-08-16 14:42:29 -07:00
|
|
|
|
let six_and_third = I20F12::from_num(19) / 3;
|
2018-08-11 08:33:31 -07:00
|
|
|
|
// four decimal digits for 12 binary digits
|
2018-08-11 08:49:36 -07:00
|
|
|
|
assert_eq!(six_and_third.to_string(), "6.3333");
|
2019-01-31 16:13:53 -08:00
|
|
|
|
// find the ceil and convert to i32
|
2019-08-16 14:42:29 -07:00
|
|
|
|
assert_eq!(six_and_third.ceil().to_num::<i32>(), 7);
|
2019-02-03 12:37:17 -08:00
|
|
|
|
// we can also compare directly to integers
|
|
|
|
|
assert_eq!(six_and_third.ceil(), 7);
|
2018-08-11 08:33:31 -07:00
|
|
|
|
```
|
|
|
|
|
|
2019-01-26 13:22:18 -08:00
|
|
|
|
The type [`I20F12`] is a 32-bit fixed-point signed number with 20
|
|
|
|
|
integer bits and 12 fractional bits. It is an alias to
|
2019-08-20 07:42:37 -07:00
|
|
|
|
<code>[FixedI32][`FixedI32`]<[U12][`U12`]></code>.
|
2019-08-08 14:25:05 -07:00
|
|
|
|
The unsigned counterpart would be [`U20F12`]. Aliases are provided for
|
|
|
|
|
all combinations of integer and fractional bits adding up to a total
|
|
|
|
|
of eight, 16, 32, 64 or 128 bits.
|
2019-01-26 13:22:18 -08:00
|
|
|
|
|
2019-01-29 12:55:58 -08:00
|
|
|
|
```rust
|
2019-08-20 07:42:37 -07:00
|
|
|
|
// −8 ≤ I4F4 < 8 with steps of 1/16 (~0.06)
|
2019-01-29 12:55:58 -08:00
|
|
|
|
use fixed::types::I4F4;
|
2019-08-16 14:42:29 -07:00
|
|
|
|
let a = I4F4::from_num(1);
|
|
|
|
|
// multiplication and division by integers are possible
|
2019-01-29 12:55:58 -08:00
|
|
|
|
let ans1 = a / 5 * 17;
|
2019-08-20 07:42:37 -07:00
|
|
|
|
// 1 / 5 × 17 = 3 2/5 (3.4), but we get 3 3/16 (~3.2)
|
2019-01-29 12:55:58 -08:00
|
|
|
|
assert_eq!(ans1, I4F4::from_bits((3 << 4) + 3));
|
2019-08-19 14:15:03 -07:00
|
|
|
|
assert_eq!(ans1.to_string(), "3.2");
|
2019-01-29 12:55:58 -08:00
|
|
|
|
|
2019-08-20 07:42:37 -07:00
|
|
|
|
// −8 ≤ I4F12 < 8 with steps of 1/4096 (~0.0002)
|
2019-01-29 12:55:58 -08:00
|
|
|
|
use fixed::types::I4F12;
|
|
|
|
|
let wider_a = I4F12::from(a);
|
|
|
|
|
let wider_ans = wider_a / 5 * 17;
|
2019-08-16 14:42:29 -07:00
|
|
|
|
let ans2 = I4F4::from_num(wider_ans);
|
2019-08-20 07:42:37 -07:00
|
|
|
|
// now the answer is the much closer 3 6/16 (~3.4)
|
2019-01-29 12:55:58 -08:00
|
|
|
|
assert_eq!(ans2, I4F4::from_bits((3 << 4) + 6));
|
2019-08-19 14:15:03 -07:00
|
|
|
|
assert_eq!(ans2.to_string(), "3.4");
|
2019-01-29 12:55:58 -08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The second example shows some precision and conversion issues. The low
|
|
|
|
|
precision of `a` means that `a / 5` is 3⁄16 instead of 1⁄5, leading to
|
2019-08-20 07:42:37 -07:00
|
|
|
|
an inaccurate result `ans1` = 3 3⁄16 (~3.2). With a higher precision,
|
2019-01-29 12:55:58 -08:00
|
|
|
|
we get `wider_a / 5` equal to 819⁄4096, leading to a more accurate
|
|
|
|
|
intermediate result `wider_ans` = 3 1635⁄4096. When we convert back to
|
2019-08-20 07:42:37 -07:00
|
|
|
|
four fractional bits, we get `ans2` = 3 6⁄16 (~3.4).
|
2019-01-29 12:55:58 -08:00
|
|
|
|
|
|
|
|
|
Note that we can convert from [`I4F4`] to [`I4F12`] using [`From`], as
|
|
|
|
|
the target type has the same number of integer bits and a larger
|
|
|
|
|
number of fractional bits. Converting from [`I4F12`] to [`I4F4`]
|
|
|
|
|
cannot use [`From`] as we have less fractional bits, so we use
|
2019-08-16 14:42:29 -07:00
|
|
|
|
[`from_num`] instead.
|
2019-01-29 12:55:58 -08:00
|
|
|
|
|
2018-08-10 11:30:03 -07:00
|
|
|
|
## Using the *fixed* crate
|
|
|
|
|
|
|
|
|
|
The *fixed* crate is available on [crates.io][*fixed* crate]. To use
|
|
|
|
|
it in your crate, add it as a dependency inside [*Cargo.toml*]:
|
2018-08-10 02:13:42 -07:00
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
[dependencies]
|
2019-08-20 10:40:53 -07:00
|
|
|
|
fixed = "0.4.3"
|
2018-08-10 02:13:42 -07:00
|
|
|
|
```
|
|
|
|
|
|
2019-08-17 07:51:40 -07:00
|
|
|
|
The *fixed* crate requires rustc version 1.34.0 or later.
|
2018-08-13 03:10:53 -07:00
|
|
|
|
|
2018-08-23 04:12:32 -07:00
|
|
|
|
## Optional features
|
|
|
|
|
|
2019-01-26 15:39:24 -08:00
|
|
|
|
The *fixed* crate has two optional feature:
|
2018-08-23 04:12:32 -07:00
|
|
|
|
|
|
|
|
|
1. `f16`, disabled by default. This provides conversion to/from
|
|
|
|
|
[`f16`]. This features requires the [*half* crate].
|
2019-01-26 15:39:24 -08:00
|
|
|
|
2. `serde`, disabled by default. This provides serialization support
|
|
|
|
|
for the fixed-point types. This feature requires the
|
2019-01-29 12:55:58 -08:00
|
|
|
|
[*serde* crate].
|
2018-08-23 04:12:32 -07:00
|
|
|
|
|
2019-01-26 15:39:24 -08:00
|
|
|
|
To enable features, you can add the dependency like this to
|
2018-08-23 04:12:32 -07:00
|
|
|
|
[*Cargo.toml*]:
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
[dependencies.fixed]
|
2019-08-20 10:40:53 -07:00
|
|
|
|
version = "0.4.3"
|
2019-01-26 15:39:24 -08:00
|
|
|
|
features = ["f16", "serde"]
|
2018-08-23 04:12:32 -07:00
|
|
|
|
```
|
|
|
|
|
|
2018-08-10 02:13:42 -07:00
|
|
|
|
## License
|
|
|
|
|
|
2018-08-10 02:34:17 -07:00
|
|
|
|
This crate is free software: you can redistribute it and/or modify it
|
|
|
|
|
under the terms of either
|
2018-08-10 02:13:42 -07:00
|
|
|
|
|
2018-08-10 11:30:03 -07:00
|
|
|
|
* the [Apache License, Version 2.0][LICENSE-APACHE] or
|
|
|
|
|
* the [MIT License][LICENSE-MIT]
|
2018-08-10 02:13:42 -07:00
|
|
|
|
|
|
|
|
|
at your option.
|
|
|
|
|
|
|
|
|
|
### Contribution
|
|
|
|
|
|
|
|
|
|
Unless you explicitly state otherwise, any contribution intentionally
|
2018-08-10 11:30:03 -07:00
|
|
|
|
submitted for inclusion in the work by you, as defined in the Apache
|
|
|
|
|
License, Version 2.0, shall be dual licensed as above, without any
|
2018-08-10 02:13:42 -07:00
|
|
|
|
additional terms or conditions.
|
|
|
|
|
|
|
|
|
|
[*Cargo.toml*]: https://doc.rust-lang.org/cargo/guide/dependencies.html
|
2018-08-10 11:30:03 -07:00
|
|
|
|
[*fixed* crate]: https://crates.io/crates/fixed
|
2018-08-23 04:12:32 -07:00
|
|
|
|
[*half* crate]: https://crates.io/crates/half
|
2019-01-26 15:39:24 -08:00
|
|
|
|
[*serde* crate]: https://crates.io/crates/serde
|
2018-08-10 11:30:03 -07:00
|
|
|
|
[*typenum* crate]: https://crates.io/crates/typenum
|
2018-08-10 02:13:42 -07:00
|
|
|
|
[LICENSE-APACHE]: https://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
[LICENSE-MIT]: https://opensource.org/licenses/MIT
|
2019-08-20 07:42:37 -07:00
|
|
|
|
[`Binary`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Binary.html
|
|
|
|
|
[`Display`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Display.html
|
2019-08-20 10:40:53 -07:00
|
|
|
|
[`FixedI128`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI128.html
|
|
|
|
|
[`FixedI16`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI16.html
|
|
|
|
|
[`FixedI32`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html
|
|
|
|
|
[`FixedI64`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI64.html
|
|
|
|
|
[`FixedI8`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI8.html
|
|
|
|
|
[`FixedU128`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedU128.html
|
|
|
|
|
[`FixedU16`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedU16.html
|
|
|
|
|
[`FixedU32`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedU32.html
|
|
|
|
|
[`FixedU64`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedU64.html
|
|
|
|
|
[`FixedU8`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedU8.html
|
|
|
|
|
[`FromFixed`]: https://docs.rs/fixed/0.4.3/fixed/traits/trait.FromFixed.html
|
2019-08-20 07:42:37 -07:00
|
|
|
|
[`FromStr`]: https://doc.rust-lang.org/nightly/std/str/trait.FromStr.html
|
2019-01-26 12:16:20 -08:00
|
|
|
|
[`From`]: https://doc.rust-lang.org/nightly/std/convert/trait.From.html
|
2019-08-20 10:40:53 -07:00
|
|
|
|
[`I20F12`]: https://docs.rs/fixed/0.4.3/fixed/types/type.I20F12.html
|
|
|
|
|
[`I4F12`]: https://docs.rs/fixed/0.4.3/fixed/types/type.I4F12.html
|
|
|
|
|
[`I4F4`]: https://docs.rs/fixed/0.4.3/fixed/types/type.I4F4.html
|
2019-01-26 12:16:20 -08:00
|
|
|
|
[`Into`]: https://doc.rust-lang.org/nightly/std/convert/trait.Into.html
|
2019-08-20 10:40:53 -07:00
|
|
|
|
[`LossyFrom`]: https://docs.rs/fixed/0.4.3/fixed/traits/trait.LossyFrom.html
|
|
|
|
|
[`LossyInto`]: https://docs.rs/fixed/0.4.3/fixed/traits/trait.LossyInto.html
|
2019-08-20 07:42:37 -07:00
|
|
|
|
[`LowerHex`]: https://doc.rust-lang.org/nightly/std/fmt/trait.LowerHex.html
|
|
|
|
|
[`Octal`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Octal.html
|
2019-08-20 10:40:53 -07:00
|
|
|
|
[`ToFixed`]: https://docs.rs/fixed/0.4.3/fixed/traits/trait.ToFixed.html
|
|
|
|
|
[`U12`]: https://docs.rs/fixed/0.4.3/fixed/types/extra/type.U12.html
|
|
|
|
|
[`U20F12`]: https://docs.rs/fixed/0.4.3/fixed/types/type.U20F12.html
|
2019-08-20 07:42:37 -07:00
|
|
|
|
[`UpperHex`]: https://doc.rust-lang.org/nightly/std/fmt/trait.UpperHex.html
|
2018-08-23 04:12:32 -07:00
|
|
|
|
[`f16`]: https://docs.rs/half/^1/half/struct.f16.html
|
2019-08-20 10:40:53 -07:00
|
|
|
|
[`from_num`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.from_num
|
|
|
|
|
[`from_str_binary`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.from_str_binary
|
|
|
|
|
[`from_str_hex`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.from_str_hex
|
|
|
|
|
[`from_str_octal`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.from_str_octal
|
|
|
|
|
[`to_num`]: https://docs.rs/fixed/0.4.3/fixed/struct.FixedI32.html#method.to_num
|
2018-08-09 11:02:34 -07:00
|
|
|
|
[const generics]: https://github.com/rust-lang/rust/issues/44580
|