Changelog

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

Unreleased

2.2.1 - 2023-01-08

Changed

  • Reduced unnecessary bounds checks for SIMD operations on slices. By @Shnatsel.
  • Further slice conversion optimizations for slices. Resolves #66.

2.2.0 - 2022-12-30

Added

  • Add serialize_as_f32 and serialize_as_string functions when serde cargo feature is enabled. They allowing customizing the serialization by using #[serde(serialize_with="f16::serialize_as_f32")] attribute in serde derive macros. Closes #60.
  • Deserialize now supports deserializing from f32, f64, and string values in addition to its previous default deserialization. Closes #60.

Changed

  • Add #[inline] on fallback functions, which improved conversion execution on non-nightly rust by up to 50%. By @Shnatsel.

2.1.0 - 2022-07-18

Added

  • Add support for target_arch spirv. Some traits and functions are unavailble on this architecture. By @charles-r-earp.
  • Add total_cmp method to both float types. Closes #55, by @joseluis.

2.0.0 - 2022-06-21

Changed

  • Breaking Change Minimum supported Rust version is now 1.58.
  • Breaking Change std is now enabled as a default cargo feature. Disable default features to continue using no_std support.
  • Migrated to Rust Edition 2021.
  • Added #[must_use] attributes to functions, as appropriate.

Fixed

  • Fix a soundness bug with slice::as_ptr not correctly using mutable reference. By @Nilstrieb.

Added

  • Added const conversion methods to both f16 and bf16. These methods never use hardware intrinsics, unlike the current conversion methods, which is why they are separated into new methods. The following const methods were added:
    • from_f32_const
    • from_f64_const
    • to_f32_const
    • to_f64_const
  • Added Neg trait support for borrowed values &f16 and &bf16. By @pthariensflame.
  • Added AsPrimitive implementations from and to self, usize, and isize. By @kali.

Removed

  • Breaking Change The deprecated serialize cargo feature has been removed. Use serde cargo feature instead.
  • Breaking Change The deprecated consts module has been removed. Use associated constants on f16 instead.
  • Breaking Change The following deprecated functions have been removed:
    • f16::as_bits
    • slice::from_bits_mut
    • slice::to_bits_mut
    • slice::from_bits
    • slice::to_bits
    • vec::from_bits
    • vec::to_bits

1.8.2 - 2021-10-22

Fixed

  • Remove cargo resolver=2 from manifest to resolve errors in older versions of Rust that still worked with 1.8.0. Going forward, MSRV increases will be major version increases. Fixes #48.

1.8.1 - 2021-10-21 - Yanked

Yanked

Not recommended due to introducing compilation error in Rust versions that worked with 1.8.0.

Changed

  • Now uses cargo resolver version 2 to prevent dev-dependencies from enabling std feature on optional dependencies.

Fixed

  • Fixed compile failure when std feature is not enabled and num-traits is enabled under new resolver. Now properly uses libm num-traits feature.

1.8.0 - 2021-10-13

Changed

  • Now always implements Add, Div, Mul, Neg, Rem, and Sub traits. Previously, these were only implemented under the num-traits feature. Keep in mind they still convert to f32 and back in the implementation.
  • Minimum supported Rust version is now 1.51.
  • Made crate package REUSE compliant.
  • Docs now use intra-doc links instead of manual (and hard to maintain) links.
  • The following methods on both f16 and bf16 are now const:
    • to_le_bytes
    • to_be_bytes
    • to_ne_bytes
    • from_le_bytes
    • from_be_bytes
    • from_ne_bytes
    • is_normal
    • classify
    • signum

Added

  • Added optional implementations of zerocopy traits AsBytes and FromBytes under zerocopy cargo feature. By @samcrow.
  • Implemented the core::iter::Product and core::iter::Sum traits, with the same caveat as above about converting to f32 and back under the hood.
  • Added new associated const NEG_ONE to both f16 and bf16.
  • Added the following new methods on both f16 and bf16:
    • copysign
    • max
    • min
    • clamp

Fixed

  • Fixed a number of minor lints discovered due to improved CI.

1.7.1 - 2021-01-17

Fixed

  • Docs.rs now generates docs for bytemuck and num-traits optional features.

1.7.0 - 2021-01-17

Added

  • Added optional implementations of bytemuck traits Zeroable and Pod under bytemuck cargo feature. By @charles-r-earp.
  • Added optional implementations of num-traits traits ToPrimitive and FromPrimitive under num-traits cargo feature. By @charles-r-earp.
  • Added implementations of Binary, Octal, LowerHex, and UpperHex string format traits to format raw f16/bf16 bytes to string.

Changed

  • Debug trait implementation now formats f16/bf16 as float instead of raw bytes hex. Use newly implemented formatting traits to format in hex instead of Debug. Fixes #37.

1.6.0 - 2020-05-09

Added

  • Added LOG2_10 and LOG10_2 constants to both f16 and bf16, which were added to f32 and f64 in the standard library in 1.43.0. By @tspiteri.
  • Added to_le/be/ne_bytes and from_le/be/ne_bytes to both f16 and bf16, which were added to the standard library in 1.40.0. By @bzm3r.

1.5.0 - 2020-03-03

Added

  • Added the alloc feature to support the alloc crate in no_std environments. By @zserik. The vec module is now available with either alloc or std feature.

1.4.1 - 2020-02-10

Fixed

  • Added #[repr(transparent)] to f16/bf16 to remove undefined behavior. By @jfrimmel.

1.4.0 - 2019-10-13

Added

  • Added a bf16 type implementing the alternative bfloat16 16-bit floating point format. By @tspiteri.
  • f16::from_bits, f16::to_bits, f16::is_nan, f16::is_infinite, f16::is_finite, f16::is_sign_positive, and f16::is_sign_negative are now const fns.
  • slice::HalfBitsSliceExt and slice::HalfBitsSliceExt extension traits have been added for performing efficient reinterpret casts and conversions of slices to and from [f16] and [bf16]. These traits will use hardware SIMD conversion instructions when available and the use-intrinsics cargo feature is enabled.
  • vec::HalfBitsVecExt and vec::HalfFloatVecExt extension traits have been added for performing efficient reinterpret casts to and from Vec<f16> and Vec<bf16>. These traits are only available with the std cargo feature.
  • prelude has been added, for easy importing of most common functionality. Currently the prelude imports f16, bf16, and the new slice and vec extension traits.
  • New associated constants on f16 type to replace deprecated consts module.

Fixed

  • Software conversion (when not using use-intrinsics feature) now matches hardware rounding by rounding to nearest, ties to even. Fixes #24, by @tspiteri.
  • NaN value conversions now behave like f32 to f64 conversions, retaining sign. Fixes #23, by @tspiteri.

Changed

  • Minimum rustc version bumped to 1.32.
  • Runtime target host feature detection is now used if both std and use-intrinsics features are enabled and the compile target host does not support required features.
  • When use-intrinsics feature is enabled, will now always compile and run without error correctly regardless of compile target options.

Deprecated

  • consts module and all its constants have been deprecated; use the associated constants on f16 instead.
  • slice::from_bits has been deprecated; use slice::HalfBitsSliceExt::reinterpret_cast instead.
  • slice::from_bits_mut has been deprecated; use slice::HalfBitsSliceExt::reinterpret_cast_mut instead.
  • slice::to_bits has been deprecated; use slice::HalfFloatSliceExt::reinterpret_cast instead.
  • slice::to_bits_mut has been deprecated; use slice::HalfFloatSliceExt::reinterpret_cast_mut instead.
  • vec::from_bits has been deprecated; use vec::HalfBitsVecExt::reinterpret_into instead.
  • vec::to_bits has been deprecated; use vec::HalfFloatVecExt::reinterpret_into instead.

1.3.1 - 2019-10-04

Fixed

  • Corrected values of constants EPSILON, MAX_10_EXP, MAX_EXP, MIN_10_EXP, and MIN_EXP in consts module, as well as setting consts::NAN to match value of f32::NAN converted to f16. By @tspiteri.

1.3.0 - 2018-10-02

Added

  • slice::from_bits_mut and slice::to_bits_mut for conversion between mutable u16 and f16 slices. Fixes #16, by @johannesvollmer.

1.2.0 - 2018-09-03

Added

  • slice and optional vec (only included with std feature) modules for conversions between u16 and f16 buffers. Fixes #14, by @johannesvollmer.
  • to_bits added to replace as_bits. Fixes #12, by @tspiteri.

Fixed

  • serde optional dependency no longer uses its default std feature.

Deprecated

  • as_bits has been deprecated; use to_bits instead.
  • serialize cargo feature is deprecated; use serde instead.

1.1.2 - 2018-07-12

Fixed

  • Fixed compilation error in 1.1.1 on rustc < 1.27, now compiles again on rustc >= 1.10. Fixes #11.

1.1.1 - 2018-06-24 - Yanked

Yanked

Not recommended due to introducing compilation error on rustc versions prior to 1.27.

Fixed

  • Fix subnormal float conversions when use-intrinsics is not enabled. By @Moongoodboy-K.

1.1.0 - 2018-03-17

Added

  • Made to_f32 and to_f64 public. Fixes #7, by @PSeitz.

1.0.2 - 2018-01-12

Changed

  • Update behavior of is_sign_positive and is_sign_negative to match the IEEE754 conforming behavior of the standard library since Rust 1.20.0. Fixes #3, by @tspiteri.
  • Small optimization on is_nan and is_infinite from @tspiteri.

Fixed

  • Fix comparisons of +0 to -0 and comparisons involving negative numbers. Fixes #2, by @tspiteri.
  • Fix loss of sign when converting f16 and f32 to f16, and case where f64 NaN could be converted to f16 infinity instead of NaN. Fixes #5, by @tspiteri.

1.0.1 - 2017-08-30

Added

  • More README documentation.
  • Badges and categories in crate metadata.

Changed

  • serde dependency updated to 1.0 stable.
  • Writing changelog manually.

1.0.0 - 2017-02-03

Added

  • Update to serde 0.9 and stable Rust 1.15 for serialize feature.

0.1.1 - 2017-01-08

Added

  • Add serde support under new serialize feature.

Changed

  • Use no_std for crate by default.

0.1.0 - 2016-03-17

Added

  • Initial release of f16 type.