
Discussed at [1], there was an off-by-one mistake when converting from the loop routine to using `leading_zeros` for normalization. Currently, using `EXP_BITS` has the effect that `ix` after the branch has its MSB _one bit to the left_ of the implicit bit's position, whereas a shift by `EXP_BITS + 1` ensures that the MSB is exactly at the implicit bit's position, matching what is done for normals (where the implicit bit is set to be explicit). This doesn't seem to have any effect in our implementation since the failing test cases from [1] appear to still have correct results. Since the result of using `EXP_BITS + 1` is more consistent with what is done for normals, apply this here. [1]: https://github.com/rust-lang/libm/pull/469#discussion_r2012473920
libm
A port of MUSL's libm to Rust.
Goals
The short term goal of this library is to enable math support (e.g. sin
, atan2
) for the
wasm32-unknown-unknown
target (cf. rust-lang/compiler-builtins). The longer
term goal is to enable math support in the core
crate.
Already usable
This crate is on crates.io and can be used today in stable #![no_std]
programs.
The API documentation can be found here.
Benchmark
The benchmarks are located in crates/libm-bench
and require a nightly Rust toolchain.
To run all benchmarks:
cargo +nightly bench --all
Contributing
Please check CONTRIBUTING.md
Minimum Rust version policy
This crate supports rustc 1.63 and newer.
License
Usage is licensed under the MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT).
Contribution
Contributions are licensed under both the MIT license and the Apache License, Version 2.0 (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0). Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as mentioned, without any additional terms or conditions.
See LICENSE.txt
for full details.