Skip to main content

Format

Enum Format 

Source
pub enum Format {
    Half,
    BFloat16,
    Single,
    Double,
    X87Extended,
    Quad,
    DoubleDouble,
}
Expand description

A floating point format.

Six of the seven are IEEE 754 binary encodings and the seventh is not, which is why Format::is_ieee exists and why most of the questions below are answerable for six of them. The split is the same one the psABIs make, so this is the enum rucc-abi describes a target’s scalar types with as well as the one Float carries.

Variants§

§

Half

IEEE binary16, which C spells _Float16.

§

BFloat16

The brain float, an IEEE binary32 with the low sixteen bits of its significand cut off, which C spells __bf16. It has the range of a float and less than half its precision.

§

Single

IEEE binary32, which C spells float.

§

Double

IEEE binary64, which C spells double.

§

X87Extended

The x87 eighty bit format, which is long double on x86. It is the one format here that stores the leading significand bit rather than leaving it implied.

§

Quad

IEEE binary128, which C spells _Float128, and which is long double on AArch64 Linux, on s390x and on RISC-V.

§

DoubleDouble

IBM double-double, a pair of doubles whose sum is the value, which is long double on 64-bit PowerPC.

Not an IEEE encoding and not a binary floating point format in IEEE’s sense. It has no exponent field of its own, no significand field of its own, and no single precision: the gap between the two halves is whatever the value needs, so the number of significand bits between the top of the first and the bottom of the second is a hundred and six for some values and two thousand for others. __LDBL_MANT_DIG__ says 106 because a macro has to say something, and 106 is the figure everyone quotes, but it is the precision you get near the top of the significand rather than a property of the format.

Float does not represent one, per Format::is_ieee.

Implementations§

Source§

impl Format

Source

pub const fn name(self) -> &'static str

The short name this format is written under, which is its width in bits for all of them but the two whose width does not tell them apart from something else.

Source

pub fn from_name(name: &str) -> Option<Self>

The format of that name, and None for a word that is not one.

Source

pub const fn is_ieee(self) -> bool

Whether the format is an IEEE 754 binary encoding, which is every one of them but the double-double.

This is the guard on the rest of this type and on Float. A number in an IEEE encoding is a sign, an exponent and one significand, which is what Float stores, so every format that answers true here has a precision, an exponent range and a bit layout and can be parsed, encoded and folded. The double-double is a pair, so it has none of those and Float refuses it rather than answering with the nominal figures, which are close enough to right to be believed and wrong often enough to matter.

Source

pub const fn precision(self) -> u32

The number of significand bits, counting the leading one whether it is stored or not.

§Panics

If the format is not an IEEE encoding, per Format::is_ieee.

Source

pub const fn max_exponent(self) -> i32

The exponent of the largest finite number, which is also the exponent bias.

§Panics

If the format is not an IEEE encoding, per Format::is_ieee.

Source

pub const fn min_exponent(self) -> i32

The exponent of the smallest normal number.

§Panics

If the format is not an IEEE encoding, per Format::is_ieee.

Source

pub const fn width(self) -> u32

The width of the encoding in bits, which for x87 is the eighty bits that matter and not the ninety six or hundred and twenty eight an ABI pads them out to.

Answered for every format, the double-double included, because a width is the one fact a pair of doubles does have: it is the two of them and nothing else, so it is a hundred and twenty eight bits the same way binary128 is.

Source

pub const fn has_explicit_integer_bit(self) -> bool

Whether the leading significand bit is stored rather than implied.

§Panics

If the format is not an IEEE encoding, per Format::is_ieee.

Trait Implementations§

Source§

impl Clone for Format

Source§

fn clone(&self) -> Format

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Format

Source§

impl Debug for Format

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for Format

Source§

impl Hash for Format

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Format

Source§

fn eq(&self, other: &Format) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Format

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.