1use core::ops::{Index, IndexMut};
9use core::{fmt::Debug, ops::SubAssign};
10
11use serde::{Deserialize, Serialize};
12
13use crate::{
14 array_default::ArrayDefault,
15 array_default::ArrayIterArgmin,
16 array_default::PrimitiveArray,
17 array_default::{ArrayIter, ArrayIterArgmax},
18 prelude::{precompute_linear_counting, One},
19 primitive::Primitive,
20 zeros::Zero,
21};
22
23pub trait WordType<const BITS: usize>: Precision {
24 type Words: Copy
34 + Debug
35 + IndexMut<usize, Output = u32>
36 + Index<usize, Output = u32>
37 + Send
38 + Sync
39 + Eq
40 + PartialEq
41 + ArrayIter<u32>
42 + ArrayDefault<u32>; type RegisterMultiplicities: Index<usize, Output = Self::NumberOfZeros>
69 + IndexMut<usize, Output = Self::NumberOfZeros>
70 + Copy
71 + Debug
72 + Eq
73 + ArrayIterArgmin<Self::NumberOfZeros>
74 + ArrayIterArgmax<Self::NumberOfZeros>
75 + ArrayDefault<Self::NumberOfZeros>
76 + PrimitiveArray<f32, Array = Self::FloatMultiplicities>
77 + ArrayIter<Self::NumberOfZeros>;
78
79 type FloatMultiplicities: Index<usize, Output = f32>;
80}
81
82pub trait Precision: Default + Copy + Eq + Serialize + Debug + Send + Sync {
83 type NumberOfZeros: Copy
89 + Debug
90 + Eq
91 + PartialEq
92 + Primitive<usize>
93 + Primitive<f32>
94 + Send
95 + Copy
96 + Sync
97 + Zero
98 + One
99 + Ord
100 + PartialOrd
101 + SubAssign;
102 const EXPONENT: usize;
105 const NUMBER_OF_REGISTERS: usize = 1 << Self::EXPONENT;
107 type SmallCorrections: Index<usize, Output = f32> + Copy;
109 type Registers: Index<usize, Output = u32> + Copy + ArrayDefault<u32> + ArrayIter<u32>;
110 const SMALL_CORRECTIONS: Self::SmallCorrections;
112}
113
114#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
115pub struct Precision4;
116
117impl Precision for Precision4 {
118 type NumberOfZeros = u8;
119 const EXPONENT: usize = 4;
120 type SmallCorrections = [f32; 16];
121 type Registers = [u32; 16];
122 const SMALL_CORRECTIONS: Self::SmallCorrections =
123 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
124}
125
126impl WordType<1> for Precision4 {
127 type Words = [u32; 1];
128 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
129 type FloatMultiplicities = [f32; 2];
130}
131
132impl WordType<2> for Precision4 {
133 type Words = [u32; 1];
134 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
135 type FloatMultiplicities = [f32; 4];
136}
137
138impl WordType<3> for Precision4 {
139 type Words = [u32; 2];
140 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
141 type FloatMultiplicities = [f32; 8];
142}
143
144impl WordType<4> for Precision4 {
145 type Words = [u32; 2];
146 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
147 type FloatMultiplicities = [f32; 16];
148}
149
150impl WordType<5> for Precision4 {
151 type Words = [u32; 3];
152 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
153 type FloatMultiplicities = [f32; 32];
154}
155
156impl WordType<6> for Precision4 {
157 type Words = [u32; 4];
158 type RegisterMultiplicities = [Self::NumberOfZeros; 62];
159 type FloatMultiplicities = [f32; 62];
160}
161
162#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
163pub struct Precision5;
164
165impl Precision for Precision5 {
166 type NumberOfZeros = u8;
167 const EXPONENT: usize = 5;
168 type SmallCorrections = [f32; 32];
169 type Registers = [u32; 32];
170 const SMALL_CORRECTIONS: Self::SmallCorrections =
171 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
172}
173
174impl WordType<1> for Precision5 {
175 type Words = [u32; 1];
176 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
177 type FloatMultiplicities = [f32; 2];
178}
179
180impl WordType<2> for Precision5 {
181 type Words = [u32; 2];
182 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
183 type FloatMultiplicities = [f32; 4];
184}
185
186impl WordType<3> for Precision5 {
187 type Words = [u32; 4];
188 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
189 type FloatMultiplicities = [f32; 8];
190}
191
192impl WordType<4> for Precision5 {
193 type Words = [u32; 4];
194 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
195 type FloatMultiplicities = [f32; 16];
196}
197
198impl WordType<5> for Precision5 {
199 type Words = [u32; 6];
200 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
201 type FloatMultiplicities = [f32; 32];
202}
203
204impl WordType<6> for Precision5 {
205 type Words = [u32; 7];
206 type RegisterMultiplicities = [Self::NumberOfZeros; 61];
207 type FloatMultiplicities = [f32; 61];
208}
209
210#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
211pub struct Precision6;
212
213impl Precision for Precision6 {
214 type NumberOfZeros = u8;
215 const EXPONENT: usize = 6;
216 type SmallCorrections = [f32; 64];
217 type Registers = [u32; 64];
218 const SMALL_CORRECTIONS: Self::SmallCorrections =
219 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
220}
221
222impl WordType<1> for Precision6 {
223 type Words = [u32; 2];
224 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
225 type FloatMultiplicities = [f32; 2];
226}
227
228impl WordType<2> for Precision6 {
229 type Words = [u32; 4];
230 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
231 type FloatMultiplicities = [f32; 4];
232}
233
234impl WordType<3> for Precision6 {
235 type Words = [u32; 7];
236 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
237 type FloatMultiplicities = [f32; 8];
238}
239
240impl WordType<4> for Precision6 {
241 type Words = [u32; 8];
242 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
243 type FloatMultiplicities = [f32; 16];
244}
245
246impl WordType<5> for Precision6 {
247 type Words = [u32; 11];
248 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
249 type FloatMultiplicities = [f32; 32];
250}
251
252impl WordType<6> for Precision6 {
253 type Words = [u32; 13];
254 type RegisterMultiplicities = [Self::NumberOfZeros; 60];
255 type FloatMultiplicities = [f32; 60];
256}
257
258impl WordType<7> for Precision6 {
259 type Words = [u32; 16];
260 type RegisterMultiplicities = [Self::NumberOfZeros; 128];
261 type FloatMultiplicities = [f32; 128];
262}
263
264impl WordType<8> for Precision6 {
265 type Words = [u32; 16];
266 type RegisterMultiplicities = [Self::NumberOfZeros; 256];
267 type FloatMultiplicities = [f32; 256];
268}
269
270#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
271pub struct Precision7;
272
273impl Precision for Precision7 {
274 type NumberOfZeros = u8;
275 const EXPONENT: usize = 7;
276 type SmallCorrections = [f32; 128];
277 type Registers = [u32; 128];
278 const SMALL_CORRECTIONS: Self::SmallCorrections =
279 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
280}
281
282impl WordType<1> for Precision7 {
283 type Words = [u32; 4];
284 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
285 type FloatMultiplicities = [f32; 2];
286}
287
288impl WordType<2> for Precision7 {
289 type Words = [u32; 8];
290 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
291 type FloatMultiplicities = [f32; 4];
292}
293
294impl WordType<3> for Precision7 {
295 type Words = [u32; 13];
296 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
297 type FloatMultiplicities = [f32; 8];
298}
299
300impl WordType<4> for Precision7 {
301 type Words = [u32; 16];
302 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
303 type FloatMultiplicities = [f32; 16];
304}
305
306impl WordType<5> for Precision7 {
307 type Words = [u32; 22];
308 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
309 type FloatMultiplicities = [f32; 32];
310}
311
312impl WordType<6> for Precision7 {
313 type Words = [u32; 26];
314 type RegisterMultiplicities = [Self::NumberOfZeros; 59];
315 type FloatMultiplicities = [f32; 59];
316}
317
318#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
319pub struct Precision8;
320
321impl Precision for Precision8 {
322 type NumberOfZeros = u16;
323 const EXPONENT: usize = 8;
324 type SmallCorrections = [f32; 256];
325 type Registers = [u32; 256];
326 const SMALL_CORRECTIONS: Self::SmallCorrections =
327 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
328}
329impl WordType<1> for Precision8 {
330 type Words = [u32; 8];
331 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
332 type FloatMultiplicities = [f32; 2];
333}
334
335impl WordType<2> for Precision8 {
336 type Words = [u32; 16];
337 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
338 type FloatMultiplicities = [f32; 4];
339}
340
341impl WordType<3> for Precision8 {
342 type Words = [u32; 26];
343 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
344 type FloatMultiplicities = [f32; 8];
345}
346
347impl WordType<4> for Precision8 {
348 type Words = [u32; 32];
349 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
350 type FloatMultiplicities = [f32; 16];
351}
352
353impl WordType<5> for Precision8 {
354 type Words = [u32; 43];
355 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
356 type FloatMultiplicities = [f32; 32];
357}
358
359impl WordType<6> for Precision8 {
360 type Words = [u32; 52];
361 type RegisterMultiplicities = [Self::NumberOfZeros; 58];
362 type FloatMultiplicities = [f32; 58];
363}
364
365#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
366pub struct Precision9;
367
368impl Precision for Precision9 {
369 type NumberOfZeros = u16;
370 const EXPONENT: usize = 9;
371 type SmallCorrections = [f32; 512];
372 type Registers = [u32; 512];
373 const SMALL_CORRECTIONS: Self::SmallCorrections =
374 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
375}
376impl WordType<1> for Precision9 {
377 type Words = [u32; 16];
378 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
379 type FloatMultiplicities = [f32; 2];
380}
381
382impl WordType<2> for Precision9 {
383 type Words = [u32; 32];
384 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
385 type FloatMultiplicities = [f32; 4];
386}
387
388impl WordType<3> for Precision9 {
389 type Words = [u32; 52];
390 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
391 type FloatMultiplicities = [f32; 8];
392}
393
394impl WordType<4> for Precision9 {
395 type Words = [u32; 64];
396 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
397 type FloatMultiplicities = [f32; 16];
398}
399
400impl WordType<5> for Precision9 {
401 type Words = [u32; 86];
402 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
403 type FloatMultiplicities = [f32; 32];
404}
405
406impl WordType<6> for Precision9 {
407 type Words = [u32; 103];
408 type RegisterMultiplicities = [Self::NumberOfZeros; 57];
409 type FloatMultiplicities = [f32; 57];
410}
411
412#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
413pub struct Precision10;
414
415impl Precision for Precision10 {
416 type NumberOfZeros = u16;
417 const EXPONENT: usize = 10;
418 type SmallCorrections = [f32; 1024];
419 type Registers = [u32; 1024];
420 const SMALL_CORRECTIONS: Self::SmallCorrections =
421 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
422}
423impl WordType<1> for Precision10 {
424 type Words = [u32; 32];
425 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
426 type FloatMultiplicities = [f32; 2];
427}
428
429impl WordType<2> for Precision10 {
430 type Words = [u32; 64];
431 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
432 type FloatMultiplicities = [f32; 4];
433}
434
435impl WordType<3> for Precision10 {
436 type Words = [u32; 103];
437 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
438 type FloatMultiplicities = [f32; 8];
439}
440
441impl WordType<4> for Precision10 {
442 type Words = [u32; 128];
443 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
444 type FloatMultiplicities = [f32; 16];
445}
446
447impl WordType<5> for Precision10 {
448 type Words = [u32; 171];
449 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
450 type FloatMultiplicities = [f32; 32];
451}
452
453impl WordType<6> for Precision10 {
454 type Words = [u32; 205];
455 type RegisterMultiplicities = [Self::NumberOfZeros; 56];
456 type FloatMultiplicities = [f32; 56];
457}
458
459#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
460pub struct Precision11;
461
462impl Precision for Precision11 {
463 type NumberOfZeros = u16;
464 const EXPONENT: usize = 11;
465 type SmallCorrections = [f32; 2048];
466 type Registers = [u32; 2048];
467 const SMALL_CORRECTIONS: Self::SmallCorrections =
468 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
469}
470impl WordType<1> for Precision11 {
471 type Words = [u32; 64];
472 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
473 type FloatMultiplicities = [f32; 2];
474}
475
476impl WordType<2> for Precision11 {
477 type Words = [u32; 128];
478 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
479 type FloatMultiplicities = [f32; 4];
480}
481
482impl WordType<3> for Precision11 {
483 type Words = [u32; 205];
484 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
485 type FloatMultiplicities = [f32; 8];
486}
487
488impl WordType<4> for Precision11 {
489 type Words = [u32; 256];
490 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
491 type FloatMultiplicities = [f32; 16];
492}
493
494impl WordType<5> for Precision11 {
495 type Words = [u32; 342];
496 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
497 type FloatMultiplicities = [f32; 32];
498}
499
500impl WordType<6> for Precision11 {
501 type Words = [u32; 410];
502 type RegisterMultiplicities = [Self::NumberOfZeros; 55];
503 type FloatMultiplicities = [f32; 55];
504}
505
506#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
507pub struct Precision12;
508
509impl Precision for Precision12 {
510 type NumberOfZeros = u16;
511 const EXPONENT: usize = 12;
512 type SmallCorrections = [f32; 4096];
513 type Registers = [u32; 4096];
514 const SMALL_CORRECTIONS: Self::SmallCorrections =
515 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
516}
517impl WordType<1> for Precision12 {
518 type Words = [u32; 128];
519 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
520 type FloatMultiplicities = [f32; 2];
521}
522
523impl WordType<2> for Precision12 {
524 type Words = [u32; 256];
525 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
526 type FloatMultiplicities = [f32; 4];
527}
528
529impl WordType<3> for Precision12 {
530 type Words = [u32; 410];
531 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
532 type FloatMultiplicities = [f32; 8];
533}
534
535impl WordType<4> for Precision12 {
536 type Words = [u32; 512];
537 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
538 type FloatMultiplicities = [f32; 16];
539}
540
541impl WordType<5> for Precision12 {
542 type Words = [u32; 683];
543 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
544 type FloatMultiplicities = [f32; 32];
545}
546
547impl WordType<6> for Precision12 {
548 type Words = [u32; 820];
549 type RegisterMultiplicities = [Self::NumberOfZeros; 54];
550 type FloatMultiplicities = [f32; 54];
551}
552
553#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
554pub struct Precision13;
555
556impl Precision for Precision13 {
557 type NumberOfZeros = u16;
558 const EXPONENT: usize = 13;
559 type SmallCorrections = [f32; 8192];
560 type Registers = [u32; 8192];
561 const SMALL_CORRECTIONS: Self::SmallCorrections =
562 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
563}
564impl WordType<1> for Precision13 {
565 type Words = [u32; 256];
566 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
567 type FloatMultiplicities = [f32; 2];
568}
569
570impl WordType<2> for Precision13 {
571 type Words = [u32; 512];
572 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
573 type FloatMultiplicities = [f32; 4];
574}
575
576impl WordType<3> for Precision13 {
577 type Words = [u32; 820];
578 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
579 type FloatMultiplicities = [f32; 8];
580}
581
582impl WordType<4> for Precision13 {
583 type Words = [u32; 1024];
584 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
585 type FloatMultiplicities = [f32; 16];
586}
587
588impl WordType<5> for Precision13 {
589 type Words = [u32; 1366];
590 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
591 type FloatMultiplicities = [f32; 32];
592}
593
594impl WordType<6> for Precision13 {
595 type Words = [u32; 1639];
596 type RegisterMultiplicities = [Self::NumberOfZeros; 53];
597 type FloatMultiplicities = [f32; 53];
598}
599
600#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
601pub struct Precision14;
602
603impl Precision for Precision14 {
604 type NumberOfZeros = u16;
605 const EXPONENT: usize = 14;
606 type SmallCorrections = [f32; 16384];
607 type Registers = [u32; 16384];
608 const SMALL_CORRECTIONS: Self::SmallCorrections =
609 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
610}
611impl WordType<1> for Precision14 {
612 type Words = [u32; 512];
613 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
614 type FloatMultiplicities = [f32; 2];
615}
616
617impl WordType<2> for Precision14 {
618 type Words = [u32; 1024];
619 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
620 type FloatMultiplicities = [f32; 4];
621}
622
623impl WordType<3> for Precision14 {
624 type Words = [u32; 1639];
625 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
626 type FloatMultiplicities = [f32; 8];
627}
628
629impl WordType<4> for Precision14 {
630 type Words = [u32; 2048];
631 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
632 type FloatMultiplicities = [f32; 16];
633}
634
635impl WordType<5> for Precision14 {
636 type Words = [u32; 2731];
637 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
638 type FloatMultiplicities = [f32; 32];
639}
640
641impl WordType<6> for Precision14 {
642 type Words = [u32; 3277];
643 type RegisterMultiplicities = [Self::NumberOfZeros; 52];
644 type FloatMultiplicities = [f32; 52];
645}
646
647#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
648pub struct Precision15;
649
650impl Precision for Precision15 {
651 type NumberOfZeros = u16;
652 const EXPONENT: usize = 15;
653 type SmallCorrections = [f32; 32768];
654 type Registers = [u32; 32768];
655 const SMALL_CORRECTIONS: Self::SmallCorrections =
656 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
657}
658impl WordType<1> for Precision15 {
659 type Words = [u32; 1024];
660 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
661 type FloatMultiplicities = [f32; 2];
662}
663
664impl WordType<2> for Precision15 {
665 type Words = [u32; 2048];
666 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
667 type FloatMultiplicities = [f32; 4];
668}
669
670impl WordType<3> for Precision15 {
671 type Words = [u32; 3277];
672 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
673 type FloatMultiplicities = [f32; 8];
674}
675
676impl WordType<4> for Precision15 {
677 type Words = [u32; 4096];
678 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
679 type FloatMultiplicities = [f32; 16];
680}
681
682impl WordType<5> for Precision15 {
683 type Words = [u32; 5462];
684 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
685 type FloatMultiplicities = [f32; 32];
686}
687
688impl WordType<6> for Precision15 {
689 type Words = [u32; 6554];
690 type RegisterMultiplicities = [Self::NumberOfZeros; 51];
691 type FloatMultiplicities = [f32; 51];
692}
693
694#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
695pub struct Precision16;
696
697impl Precision for Precision16 {
698 type NumberOfZeros = u32;
701 const EXPONENT: usize = 16;
702 type SmallCorrections = [f32; 65536];
703 type Registers = [u32; 65536];
704 const SMALL_CORRECTIONS: Self::SmallCorrections =
705 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
706}
707impl WordType<1> for Precision16 {
708 type Words = [u32; 2048];
709 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
710 type FloatMultiplicities = [f32; 2];
711}
712
713impl WordType<2> for Precision16 {
714 type Words = [u32; 4096];
715 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
716 type FloatMultiplicities = [f32; 4];
717}
718
719impl WordType<3> for Precision16 {
720 type Words = [u32; 6554];
721 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
722 type FloatMultiplicities = [f32; 8];
723}
724
725impl WordType<4> for Precision16 {
726 type Words = [u32; 8192];
727 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
728 type FloatMultiplicities = [f32; 16];
729}
730
731impl WordType<5> for Precision16 {
732 type Words = [u32; 10923];
733 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
734 type FloatMultiplicities = [f32; 32];
735}
736
737impl WordType<6> for Precision16 {
738 type Words = [u32; 13108];
739 type RegisterMultiplicities = [Self::NumberOfZeros; 50];
740 type FloatMultiplicities = [f32; 50];
741}
742
743#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
744pub struct Precision17;
745
746impl Precision for Precision17 {
747 type NumberOfZeros = u32;
748 const EXPONENT: usize = 17;
749 type SmallCorrections = [f32; 131072];
750 type Registers = [u32; 131072];
751 const SMALL_CORRECTIONS: Self::SmallCorrections =
752 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
753}
754impl WordType<1> for Precision17 {
755 type Words = [u32; 4096];
756 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
757 type FloatMultiplicities = [f32; 2];
758}
759
760impl WordType<2> for Precision17 {
761 type Words = [u32; 8192];
762 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
763 type FloatMultiplicities = [f32; 4];
764}
765
766impl WordType<3> for Precision17 {
767 type Words = [u32; 13108];
768 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
769 type FloatMultiplicities = [f32; 8];
770}
771
772impl WordType<4> for Precision17 {
773 type Words = [u32; 16384];
774 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
775 type FloatMultiplicities = [f32; 16];
776}
777
778impl WordType<5> for Precision17 {
779 type Words = [u32; 21846];
780 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
781 type FloatMultiplicities = [f32; 32];
782}
783
784impl WordType<6> for Precision17 {
785 type Words = [u32; 26215];
786 type RegisterMultiplicities = [Self::NumberOfZeros; 49];
787 type FloatMultiplicities = [f32; 49];
788}
789
790#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
791pub struct Precision18;
792
793impl Precision for Precision18 {
794 type NumberOfZeros = u32;
795 const EXPONENT: usize = 18;
796 type SmallCorrections = [f32; 262144];
797 type Registers = [u32; 262144];
798 const SMALL_CORRECTIONS: Self::SmallCorrections =
799 precompute_linear_counting::<{ Self::NUMBER_OF_REGISTERS }>();
800}
801impl WordType<1> for Precision18 {
802 type Words = [u32; 8192];
803 type RegisterMultiplicities = [Self::NumberOfZeros; 2];
804 type FloatMultiplicities = [f32; 2];
805}
806
807impl WordType<2> for Precision18 {
808 type Words = [u32; 16384];
809 type RegisterMultiplicities = [Self::NumberOfZeros; 4];
810 type FloatMultiplicities = [f32; 4];
811}
812
813impl WordType<3> for Precision18 {
814 type Words = [u32; 26215];
815 type RegisterMultiplicities = [Self::NumberOfZeros; 8];
816 type FloatMultiplicities = [f32; 8];
817}
818
819impl WordType<4> for Precision18 {
820 type Words = [u32; 32768];
821 type RegisterMultiplicities = [Self::NumberOfZeros; 16];
822 type FloatMultiplicities = [f32; 16];
823}
824
825impl WordType<5> for Precision18 {
826 type Words = [u32; 43691];
827 type RegisterMultiplicities = [Self::NumberOfZeros; 32];
828 type FloatMultiplicities = [f32; 32];
829}
830
831impl WordType<6> for Precision18 {
832 type Words = [u32; 52429];
833 type RegisterMultiplicities = [Self::NumberOfZeros; 48];
834 type FloatMultiplicities = [f32; 48];
835}