Skip to content
This repository was archived by the owner on Apr 28, 2025. It is now read-only.

Commit 6122d6a

Browse files
committed
f16 working
1 parent a01049d commit 6122d6a

File tree

1 file changed

+37
-124
lines changed

1 file changed

+37
-124
lines changed

src/math/generic/scalbn.rs

Lines changed: 37 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ where
3636
F::Int: CastFrom<i32>,
3737
F::Int: CastFrom<u32>,
3838
{
39+
dbg!();
3940
let zero = IntTy::<F>::ZERO;
4041

4142
// Bits including the implicit bit
@@ -78,146 +79,58 @@ where
7879
}
7980
}
8081
} else if n < exp_min {
81-
// WIP: for `f16` can this scale by `exp_max` rather than `(max - 1) - sig_bits`?
82-
// That scale is only 3.
83-
//
82+
if F::BITS > 16 {
83+
// WIP: for `f16` can this scale by `exp_max` rather than `(max - 1) - sig_bits`?
84+
// That scale is only 3.
85+
//
8486

85-
let mul = f_exp_min * f_exp_subnorm;
86-
let add = -exp_min - sig_total_bits as i32;
87-
dbg!(Hexf(mul), add);
87+
let mul = f_exp_min * f_exp_subnorm;
88+
let add = -exp_min - sig_total_bits as i32;
89+
dbg!(Hexf(mul), add);
8890

89-
if n < exp_min - sig_total_bits as i32 {
90-
dbg!("block 1");
91-
x *= f_exp_min;
92-
n += -exp_min;
93-
dbg!(Hexf(x), n);
94-
95-
if n < exp_min - sig_total_bits as i32 {
96-
x *= f_exp_min;
97-
n += -exp_min;
98-
dbg!(Hexf(x), n);
99-
100-
// if n < exp_min + sig_total_bits as i32 {
101-
// x *= f_exp_min;
102-
// n += -exp_min;
103-
104-
// if n < exp_min + sig_total_bits as i32 {
105-
// x *= f_exp_min;
106-
// n += -exp_min;
107-
// }
91+
x *= mul;
92+
n += add;
10893

94+
if n < exp_min {
95+
x *= mul;
96+
n += add;
10997
if n < exp_min {
110-
n = exp_min;
111-
dbg!(Hexf(x), n);
98+
x *= mul;
99+
n += add;
100+
if n < exp_min {
101+
n = exp_min;
102+
dbg!(Hexf(x), n);
103+
}
112104
}
113-
// }
114-
} else if n < exp_min {
115-
// only for f16
105+
}
106+
} else {
107+
let add = (n + sig_total_bits as i32).clamp(exp_min, sig_total_bits as i32);
108+
let mul = F::from_parts(false, (F::EXP_BIAS as i32 + add) as u32, zero);
109+
let add = -add;
110+
dbg!(add, Hexf(mul));
111+
112+
x *= mul;
113+
n += add;
114+
dbg!(Hexf(x), n);
115+
116+
if n < exp_min {
117+
let add = (n + sig_total_bits as i32).clamp(exp_min, sig_total_bits as i32);
118+
let mul = F::from_parts(false, (F::EXP_BIAS as i32 + add) as u32, zero);
119+
let add = -add;
120+
dbg!(add, Hexf(mul));
116121

117122
x *= mul;
118123
n += add;
119-
120124
dbg!(Hexf(x), n);
125+
121126
if n < exp_min {
122127
n = exp_min;
123128
dbg!(Hexf(x), n);
124129
}
125130
}
126-
} else if n < exp_min {
127-
// dbg!("block 2");
128-
// // only for f16
129-
130-
// x *= mul;
131-
// n += add;
132-
133-
// dbg!(Hexf(x), n);
134-
// if n < exp_min {
135-
// n = exp_min;
136-
// dbg!(Hexf(x), n);
137-
// }
131+
// f16
138132
}
139-
140-
// if n < exp_min {
141-
// x *= mul;
142-
// n += add;
143-
// if n < exp_min {
144-
// // x *= mul;
145-
// // n += add;
146-
// }
147-
// }
148-
149-
// // n += sig_total_bits as i32;
150-
151-
// // let mul = f_exp_min;
152-
// // let add = -exp_min;
153-
// let mut b = false;
154-
155-
// x *= mul;
156-
// n += add;
157-
// dbg!(Hexf(x), n);
158-
// if n < exp_min {
159-
// x *= mul;
160-
// n += add;
161-
// dbg!(Hexf(x), n);
162-
// if F::BITS < 32 && false {
163-
// if n < exp_min {
164-
// x *= mul;
165-
// n += add;
166-
167-
// dbg!(Hexf(x), n);
168-
// if n < exp_min {
169-
// x *= mul;
170-
// n += add;
171-
172-
// dbg!(Hexf(x), n);
173-
// if n < exp_min {
174-
// x *= mul;
175-
// n += add;
176-
177-
// dbg!(Hexf(x), n);
178-
// if n < exp_min {
179-
// x *= mul;
180-
// n += add;
181-
182-
// dbg!(Hexf(x), n);
183-
// if n < exp_min {
184-
// x *= mul;
185-
// n += add;
186-
187-
// dbg!(Hexf(x), n);
188-
// if n < exp_min {
189-
// x *= mul;
190-
// n += add;
191-
192-
// dbg!(Hexf(x), n);
193-
// if n < exp_min {
194-
// x *= mul;
195-
// n += add;
196-
197-
// dbg!(Hexf(x), n);
198-
// if n < exp_min {
199-
// n = exp_min;
200-
// dbg!(Hexf(x), n);
201-
// }
202-
// }
203-
// }
204-
// }
205-
// }
206-
// }
207-
// }
208-
// }
209-
// } else if n < exp_min + sig_total_bits as i32 {
210-
// n = exp_min;
211-
// b = true;
212-
// dbg!(Hexf(x), n);
213-
// }
214-
// }
215-
216-
// if !b {
217-
// n -= sig_total_bits as i32;
218-
// }
219133
}
220-
221134
dbg!(Hexf(x), n);
222135
let scale = F::from_parts(false, (F::EXP_BIAS as i32 + n) as u32, zero);
223136
let ret = x * scale;

0 commit comments

Comments
 (0)