src/math
directory and adjust src/math/mod.rs
accordingly. Also, uncomment the corresponding trait method in src/lib.rs
.#[test]
)cargo test
to make sure it workscargo test --features musl-reference-tests
to compare your implementation against musl'scargo fmt
on your code before sending the PR. Also include “closes #42” in the PR description to close the corresponding issue.Check PR #65 for an example.
IMPORTANT The code in this crate will end up being used in the core
crate so it can not have any external dependencies (other than core
itself).
Only use relative imports within the math
directory / module, e.g. use self::fabs::fabs
or use super::k_cos
. Absolute imports from core are OK, e.g. use core::u64
.
To reinterpret a float as an integer use the to_bits
method. The MUSL code uses the GET_FLOAT_WORD
macro, or a union, to do this operation.
To reinterpret an integer as a float use the f32::from_bits
constructor. The MUSL code uses the SET_FLOAT_WORD
macro, or a union, to do this operation.
You may use other methods from core like f64::is_nan
, etc. as appropriate.
If you're implementing one of the private double-underscore functions, take a look at the “source” name in the comment at the top for an idea for alternate naming. For example, __sin
was renamed to k_sin
after the FreeBSD source code naming. Do use
these private functions in mod.rs
.
You may encounter weird literals like 0x1p127f
in the MUSL code. These are hexadecimal floating point literals. Rust (the language) doesn't support these kind of literals. The best way I have found to deal with these literals is to turn them into their integer representation using the hexf!
macro and then turn them back into floats. See below:
// Step 1: write a program to convert the float into its integer representation #[macro_use] extern crate hexf; fn main() { println!("{:#x}", hexf32!("0x1.0p127").to_bits()); }
$ # Step 2: run the program $ cargo run 0x7f000000
// Step 3: copy paste the output into libm let x1p127 = f32::from_bits(0x7f000000); // 0x1p127f === 2 ^ 12
Wrapping
newtype to avoid this problem.Normal tests can be executed with:
cargo test
If you‘d like to run tests with randomized inputs that get compared against musl itself, you’ll need to be on a Linux system and then you can execute:
cargo test --features musl-reference-tests
Note that you may need to pass --release
to Cargo if there are errors related to integer overflow.