|
36 | 36 | F::Int: CastFrom<i32>,
|
37 | 37 | F::Int: CastFrom<u32>,
|
38 | 38 | {
|
| 39 | + dbg!(); |
39 | 40 | let zero = IntTy::<F>::ZERO;
|
40 | 41 |
|
41 | 42 | // Bits including the implicit bit
|
@@ -78,146 +79,58 @@ where
|
78 | 79 | }
|
79 | 80 | }
|
80 | 81 | } 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 | + // |
84 | 86 |
|
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); |
88 | 90 |
|
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; |
108 | 93 |
|
| 94 | + if n < exp_min { |
| 95 | + x *= mul; |
| 96 | + n += add; |
109 | 97 | 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 | + } |
112 | 104 | }
|
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)); |
116 | 121 |
|
117 | 122 | x *= mul;
|
118 | 123 | n += add;
|
119 |
| - |
120 | 124 | dbg!(Hexf(x), n);
|
| 125 | + |
121 | 126 | if n < exp_min {
|
122 | 127 | n = exp_min;
|
123 | 128 | dbg!(Hexf(x), n);
|
124 | 129 | }
|
125 | 130 | }
|
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 |
138 | 132 | }
|
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 |
| - // } |
219 | 133 | }
|
220 |
| - |
221 | 134 | dbg!(Hexf(x), n);
|
222 | 135 | let scale = F::from_parts(false, (F::EXP_BIAS as i32 + n) as u32, zero);
|
223 | 136 | let ret = x * scale;
|
|
0 commit comments