Add basic f16 and f128 modules
Create empty modules so `rustdoc` has someplace to link to for these types.
This commit is contained in:
parent
454de78ea3
commit
143ecc3202
8 changed files with 150 additions and 0 deletions
|
@ -347,6 +347,10 @@ pub mod u8;
|
||||||
#[path = "num/shells/usize.rs"]
|
#[path = "num/shells/usize.rs"]
|
||||||
pub mod usize;
|
pub mod usize;
|
||||||
|
|
||||||
|
#[path = "num/f128.rs"]
|
||||||
|
pub mod f128;
|
||||||
|
#[path = "num/f16.rs"]
|
||||||
|
pub mod f16;
|
||||||
#[path = "num/f32.rs"]
|
#[path = "num/f32.rs"]
|
||||||
pub mod f32;
|
pub mod f32;
|
||||||
#[path = "num/f64.rs"]
|
#[path = "num/f64.rs"]
|
||||||
|
|
16
library/core/src/num/f128.rs
Normal file
16
library/core/src/num/f128.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
//! Constants for the `f128` quadruple-precision floating point type.
|
||||||
|
//!
|
||||||
|
//! *[See also the `f128` primitive type][f128].*
|
||||||
|
//!
|
||||||
|
//! Mathematically significant numbers are provided in the `consts` sub-module.
|
||||||
|
//!
|
||||||
|
//! For the constants defined directly in this module
|
||||||
|
//! (as distinct from those defined in the `consts` sub-module),
|
||||||
|
//! new code should instead use the associated constants
|
||||||
|
//! defined directly on the `f128` type.
|
||||||
|
|
||||||
|
#![unstable(feature = "f128", issue = "116909")]
|
||||||
|
|
||||||
|
/// Basic mathematical constants.
|
||||||
|
#[unstable(feature = "f128", issue = "116909")]
|
||||||
|
pub mod consts {}
|
16
library/core/src/num/f16.rs
Normal file
16
library/core/src/num/f16.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
//! Constants for the `f16` half-precision floating point type.
|
||||||
|
//!
|
||||||
|
//! *[See also the `f16` primitive type][f16].*
|
||||||
|
//!
|
||||||
|
//! Mathematically significant numbers are provided in the `consts` sub-module.
|
||||||
|
//!
|
||||||
|
//! For the constants defined directly in this module
|
||||||
|
//! (as distinct from those defined in the `consts` sub-module),
|
||||||
|
//! new code should instead use the associated constants
|
||||||
|
//! defined directly on the `f16` type.
|
||||||
|
|
||||||
|
#![unstable(feature = "f16", issue = "116909")]
|
||||||
|
|
||||||
|
/// Basic mathematical constants.
|
||||||
|
#[unstable(feature = "f16", issue = "116909")]
|
||||||
|
pub mod consts {}
|
11
library/std/src/f128.rs
Normal file
11
library/std/src/f128.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
//! Constants for the `f128` double-precision floating point type.
|
||||||
|
//!
|
||||||
|
//! *[See also the `f128` primitive type](primitive@f128).*
|
||||||
|
//!
|
||||||
|
//! Mathematically significant numbers are provided in the `consts` sub-module.
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests;
|
||||||
|
|
||||||
|
#[unstable(feature = "f128", issue = "116909")]
|
||||||
|
pub use core::f128::consts;
|
40
library/std/src/f128/tests.rs
Normal file
40
library/std/src/f128/tests.rs
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#![allow(dead_code)] // FIXME(f16_f128): remove once constants are used
|
||||||
|
|
||||||
|
/// Smallest number
|
||||||
|
const TINY_BITS: u128 = 0x1;
|
||||||
|
/// Next smallest number
|
||||||
|
const TINY_UP_BITS: u128 = 0x2;
|
||||||
|
/// Exponent = 0b11...10, Sifnificand 0b1111..10. Min val > 0
|
||||||
|
const MAX_DOWN_BITS: u128 = 0x7ffeffffffffffffffffffffffffffff;
|
||||||
|
/// Zeroed exponent, full significant
|
||||||
|
const LARGEST_SUBNORMAL_BITS: u128 = 0x0000ffffffffffffffffffffffffffff;
|
||||||
|
/// Exponent = 0b1, zeroed significand
|
||||||
|
const SMALLEST_NORMAL_BITS: u128 = 0x00010000000000000000000000000000;
|
||||||
|
/// First pattern over the mantissa
|
||||||
|
const NAN_MASK1: u128 = 0x0000aaaaaaaaaaaaaaaaaaaaaaaaaaaa;
|
||||||
|
/// Second pattern over the mantissa
|
||||||
|
const NAN_MASK2: u128 = 0x00005555555555555555555555555555;
|
||||||
|
|
||||||
|
/// Compare by value
|
||||||
|
#[allow(unused_macros)]
|
||||||
|
macro_rules! assert_f128_eq {
|
||||||
|
($a:expr, $b:expr) => {
|
||||||
|
let (l, r): (&f128, &f128) = (&$a, &$b);
|
||||||
|
assert_eq!(*l, *r, "\na: {:#0130x}\nb: {:#0130x}", l.to_bits(), r.to_bits())
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compare by representation
|
||||||
|
#[allow(unused_macros)]
|
||||||
|
macro_rules! assert_f128_biteq {
|
||||||
|
($a:expr, $b:expr) => {
|
||||||
|
let (l, r): (&f128, &f128) = (&$a, &$b);
|
||||||
|
let lb = l.to_bits();
|
||||||
|
let rb = r.to_bits();
|
||||||
|
assert_eq!(
|
||||||
|
lb, rb,
|
||||||
|
"float {:?} is not bitequal to {:?}.\na: {:#0130x}\nb: {:#0130x}",
|
||||||
|
*l, *r, lb, rb
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
11
library/std/src/f16.rs
Normal file
11
library/std/src/f16.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
//! Constants for the `f16` double-precision floating point type.
|
||||||
|
//!
|
||||||
|
//! *[See also the `f16` primitive type](primitive@f16).*
|
||||||
|
//!
|
||||||
|
//! Mathematically significant numbers are provided in the `consts` sub-module.
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests;
|
||||||
|
|
||||||
|
#[unstable(feature = "f16", issue = "116909")]
|
||||||
|
pub use core::f16::consts;
|
46
library/std/src/f16/tests.rs
Normal file
46
library/std/src/f16/tests.rs
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#![allow(dead_code)] // FIXME(f16_f128): remove once constants are used
|
||||||
|
|
||||||
|
// We run out of precision pretty quickly with f16
|
||||||
|
const F16_APPROX_L1: f16 = 0.001;
|
||||||
|
const F16_APPROX_L2: f16 = 0.01;
|
||||||
|
const F16_APPROX_L3: f16 = 0.1;
|
||||||
|
const F16_APPROX_L4: f16 = 0.5;
|
||||||
|
|
||||||
|
/// Smallest number
|
||||||
|
const TINY_BITS: u16 = 0x1;
|
||||||
|
/// Next smallest number
|
||||||
|
const TINY_UP_BITS: u16 = 0x2;
|
||||||
|
/// Exponent = 0b11...10, Sifnificand 0b1111..10. Min val > 0
|
||||||
|
const MAX_DOWN_BITS: u16 = 0x7bfe;
|
||||||
|
/// Zeroed exponent, full significant
|
||||||
|
const LARGEST_SUBNORMAL_BITS: u16 = 0x03ff;
|
||||||
|
/// Exponent = 0b1, zeroed significand
|
||||||
|
const SMALLEST_NORMAL_BITS: u16 = 0x0400;
|
||||||
|
/// First pattern over the mantissa
|
||||||
|
const NAN_MASK1: u16 = 0x02aa;
|
||||||
|
/// Second pattern over the mantissa
|
||||||
|
const NAN_MASK2: u16 = 0x0155;
|
||||||
|
|
||||||
|
/// Compare by value
|
||||||
|
#[allow(unused_macros)]
|
||||||
|
macro_rules! assert_f16_eq {
|
||||||
|
($a:expr, $b:expr) => {
|
||||||
|
let (l, r): (&f16, &f16) = (&$a, &$b);
|
||||||
|
assert_eq!(*l, *r, "\na: {:#018x}\nb: {:#018x}", l.to_bits(), r.to_bits())
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compare by representation
|
||||||
|
#[allow(unused_macros)]
|
||||||
|
macro_rules! assert_f16_biteq {
|
||||||
|
($a:expr, $b:expr) => {
|
||||||
|
let (l, r): (&f16, &f16) = (&$a, &$b);
|
||||||
|
let lb = l.to_bits();
|
||||||
|
let rb = r.to_bits();
|
||||||
|
assert_eq!(
|
||||||
|
lb, rb,
|
||||||
|
"float {:?} is not bitequal to {:?}.\na: {:#018x}\nb: {:#018x}",
|
||||||
|
*l, *r, lb, rb
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
|
@ -283,6 +283,8 @@
|
||||||
#![feature(doc_masked)]
|
#![feature(doc_masked)]
|
||||||
#![feature(doc_notable_trait)]
|
#![feature(doc_notable_trait)]
|
||||||
#![feature(dropck_eyepatch)]
|
#![feature(dropck_eyepatch)]
|
||||||
|
#![feature(f128)]
|
||||||
|
#![feature(f16)]
|
||||||
#![feature(if_let_guard)]
|
#![feature(if_let_guard)]
|
||||||
#![feature(intra_doc_pointers)]
|
#![feature(intra_doc_pointers)]
|
||||||
#![feature(lang_items)]
|
#![feature(lang_items)]
|
||||||
|
@ -558,6 +560,10 @@ pub use core::u8;
|
||||||
#[allow(deprecated, deprecated_in_future)]
|
#[allow(deprecated, deprecated_in_future)]
|
||||||
pub use core::usize;
|
pub use core::usize;
|
||||||
|
|
||||||
|
#[unstable(feature = "f128", issue = "116909")]
|
||||||
|
pub mod f128;
|
||||||
|
#[unstable(feature = "f16", issue = "116909")]
|
||||||
|
pub mod f16;
|
||||||
pub mod f32;
|
pub mod f32;
|
||||||
pub mod f64;
|
pub mod f64;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue