1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use crate::float::*;
use crate::util::*;
use super::bignum::ToBigfloat;
use super::errors::FloatErrors;
pub(super) trait FloatType:
FloatRounding<u64> +
FloatRounding<u128> +
StablePower
{
type Mantissa: Mantissa;
type ExtendedFloat: ExtendedFloatType<Self>;
}
impl FloatType for f32 {
type Mantissa = Self::Unsigned;
type ExtendedFloat = ExtendedFloat<Self::Mantissa>;
}
impl FloatType for f64 {
type Mantissa = Self::Unsigned;
type ExtendedFloat = ExtendedFloat<Self::Mantissa>;
}
pub(super) trait MantissaType:
Mantissa +
FloatErrors
{}
impl MantissaType for u64 {
}
impl MantissaType for u128 {
}
pub(super) trait ExtendedFloatType<F: FloatType>:
ToBigfloat<F::Mantissa> +
From<F>
{
fn mant(&self) -> F::Mantissa;
fn exp(&self) -> i32;
fn set_mant(&mut self, mant: F::Mantissa);
fn set_exp(&mut self, exp: i32);
}
impl ExtendedFloatType<f32> for ExtendedFloat<u32> {
perftools_inline!{
fn mant(&self) -> u32 {
self.mant
}}
perftools_inline!{
fn exp(&self) -> i32 {
self.exp
}}
perftools_inline!{
fn set_mant(&mut self, mant: u32) {
self.mant = mant;
}}
perftools_inline!{
fn set_exp(&mut self, exp: i32) {
self.exp = exp;
}}
}
impl ExtendedFloatType<f64> for ExtendedFloat<u64> {
perftools_inline!{
fn mant(&self) -> u64 {
self.mant
}}
perftools_inline!{
fn exp(&self) -> i32 {
self.exp
}}
perftools_inline!{
fn set_mant(&mut self, mant: u64) {
self.mant = mant;
}}
perftools_inline!{
fn set_exp(&mut self, exp: i32) {
self.exp = exp;
}}
}