| Crates.io | litl-nanval |
| lib.rs | litl-nanval |
| version | 0.2.0 |
| created_at | 2022-11-15 15:49:07.591015+00 |
| updated_at | 2022-11-15 15:49:07.591015+00 |
| description | A 64-bit value, that is either a floating-point number (`f64`), or an arbitrary 52-bit integer. |
| homepage | https://github.com/usegarden/nanval |
| repository | https://github.com/usegarden/nanval |
| max_upload_size | |
| id | 715790 |
| size | 25,820 |
A no_std, zero-dependency crate for the creation and handling of NaN-tagged values.
Inspired by this article and this crate.
When a 64-bit floating-point number is set to NaN/0x7FF8000000000000, its bits are as follows:
s111 1111 1111 1qxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
^ ^\____________________________________________________________/
| | ^
| Sign Bit | Quiet Bit | Data Bits
As long as the data bits aren't all set to 0, indicating the original/sentinel NaN value, they can be literally anything else! This gives us 50 bits to mess with/use as we please...
Look at the module [
crate::uint] for this.
TODO: Add explanation.
Look at the module [
crate::cell] for this.
Since it doesn't matter what the sign-bit s is set to, we can use it as a flag/marker that indicates that the value is some kind of cell or ptr.
Combine this with the fact that basically all x64-platforms only use the lower 48 or 50 bits for addressing (ignoring CHERI shenanigans), we are left with 3 bits (that includes the 'quiet' bit) to store some kind of type-tag for the cell; look at the [crate::cell::CellTag].