math/
round.rs

1//! Rounding functions
2extern crate rand;
3
4/// Round up.
5///
6/// Round `value` up to accuracy defined by `scale`.
7/// Positive `scale` defines the number of decimal digits in the result
8/// while negative `scale` rounds to a whole number and defines the number
9/// of trailing zeroes in the result.
10///
11/// # Arguments
12///
13/// * `value` - value to round
14/// * `scale` - result accuracy
15///
16/// # Examples
17///
18/// ```
19/// use math::round;
20///
21/// let rounded = round::ceil(3.14159, 3);
22/// assert_eq!(rounded, 3.142);
23/// ```
24///
25/// ```
26/// use math::round;
27///
28/// let rounded = round::ceil(3456., -2);
29/// assert_eq!(rounded, 3500.);
30/// ```
31pub fn ceil(value: f64, scale: i8) -> f64 {
32	let multiplier = 10f64.powi(scale as i32) as f64;
33	(value * multiplier).ceil() / multiplier
34}
35
36/// Round down.
37///
38/// Round `value` down to accuracy defined by `scale`.
39/// Positive `scale` defines the number of decimal digits in the result
40/// while negative `scale` rounds to a whole number and defines the number
41/// of trailing zeroes in the result.
42///
43/// # Arguments
44///
45/// * `value` - value to round
46/// * `scale` - result accuracy
47///
48/// # Examples
49///
50/// ```
51/// use math::round;
52///
53/// let rounded = round::floor(3.14159, 3);
54/// assert_eq!(rounded, 3.141);
55/// ```
56///
57/// ```
58/// use math::round;
59///
60/// let rounded = round::floor(3456., -2);
61/// assert_eq!(rounded, 3400.);
62/// ```
63pub fn floor(value: f64, scale: i8) -> f64 {
64	let multiplier = 10f64.powi(scale as i32) as f64;
65	(value * multiplier).floor() / multiplier
66}
67
68/// Round half away from zero.
69///
70/// Round `value` to accuracy defined by `scale`
71/// rounding half away from zero.
72/// Positive `scale` defines the number of decimal digits in the result
73/// while negative `scale` rounds to a whole number and defines the number
74/// of trailing zeroes in the result.
75///
76/// # Arguments
77///
78/// * `value` - value to round
79/// * `scale` - result accuracy
80///
81/// # Examples
82///
83/// ```
84/// use math::round;
85///
86/// let rounded = round::half_away_from_zero(3.14159, 3);
87/// assert_eq!(rounded, 3.142);
88/// ```
89///
90/// ```
91/// use math::round;
92///
93/// let rounded = round::half_away_from_zero(3456., -2);
94/// assert_eq!(rounded, 3500.);
95/// ```
96pub fn half_away_from_zero(value: f64, scale: i8) -> f64 {
97	towards_zero(value, scale, false)
98}
99
100/// Round half down.
101///
102/// Round `value` to accuracy defined by `scale`
103/// rounding half down.
104/// Positive `scale` defines the number of decimal digits in the result
105/// while negative `scale` rounds to a whole number and defines the number
106/// of trailing zeroes in the result.
107///
108/// # Arguments
109///
110/// * `value` - value to round
111/// * `scale` - result accuracy
112///
113/// # Examples
114///
115/// ```
116/// use math::round;
117///
118/// let rounded = round::half_down(3.14159, 3);
119/// assert_eq!(rounded, 3.141);
120/// ```
121///
122/// ```
123/// use math::round;
124///
125/// let rounded = round::half_down(3456., -2);
126/// assert_eq!(rounded, 3400.);
127/// ```
128pub fn half_down(value: f64, scale: i8) -> f64 {
129	up_or_down(value, scale, false)
130}
131
132/// Round half to nearest even number.
133///
134/// Round `value` to accuracy defined by `scale`
135/// rounding half to nearest even number.
136/// Positive `scale` defines the number of decimal digits in the result
137/// while negative `scale` rounds to a whole number and defines the number
138/// of trailing zeroes in the result.
139///
140/// # Arguments
141///
142/// * `value` - value to round
143/// * `scale` - result accuracy
144///
145/// # Examples
146///
147/// ```
148/// use math::round;
149///
150/// let rounded = round::half_to_even(3.14159, 3);
151/// assert_eq!(rounded, 3.142);
152/// ```
153///
154/// ```
155/// use math::round;
156///
157/// let rounded = round::half_to_even(3456., -2);
158/// assert_eq!(rounded, 3400.);
159/// ```
160pub fn half_to_even(value: f64, scale: i8) -> f64 {
161	even_or_odd(value, scale, true)
162}
163
164/// Round half to nearest odd number.
165///
166/// Round `value` to accuracy defined by `scale`
167/// rounding half to nearest odd number.
168/// Positive `scale` defines the number of decimal digits in the result
169/// while negative `scale` rounds to a whole number and defines the number
170/// of trailing zeroes in the result.
171///
172/// # Arguments
173///
174/// * `value` - value to round
175/// * `scale` - result accuracy
176///
177/// # Examples
178///
179/// ```
180/// use math::round;
181///
182/// let rounded = round::half_to_odd(3.14159, 3);
183/// assert_eq!(rounded, 3.141);
184/// ```
185///
186/// ```
187/// use math::round;
188///
189/// let rounded = round::half_to_odd(3456., -2);
190/// assert_eq!(rounded, 3500.);
191/// ```
192pub fn half_to_odd(value: f64, scale: i8) -> f64 {
193	even_or_odd(value, scale, false)
194}
195
196/// Round half towards zero.
197///
198/// Round `value` to accuracy defined by `scale`
199/// rounding half towards zero.
200/// Positive `scale` defines the number of decimal digits in the result
201/// while negative `scale` rounds to a whole number and defines the number
202/// of trailing zeroes in the result.
203///
204/// # Arguments
205///
206/// * `value` - value to round
207/// * `scale` - result accuracy
208///
209/// # Examples
210///
211/// ```
212/// use math::round;
213///
214/// let rounded = round::half_towards_zero(3.14159, 3);
215/// assert_eq!(rounded, 3.141);
216/// ```
217///
218/// ```
219/// use math::round;
220///
221/// let rounded = round::half_towards_zero(3456., -2);
222/// assert_eq!(rounded, 3400.);
223/// ```
224pub fn half_towards_zero(value: f64, scale: i8) -> f64 {
225	towards_zero(value, scale, true)
226}
227
228/// Round half up.
229///
230/// Round `value` to accuracy defined by `scale`
231/// rounding half up.
232/// Positive `scale` defines the number of decimal digits in the result
233/// while negative `scale` rounds to a whole number and defines the number
234/// of trailing zeroes in the result.
235///
236/// # Arguments
237///
238/// * `value` - value to round
239/// * `scale` - result accuracy
240///
241/// # Examples
242///
243/// ```
244/// use math::round;
245///
246/// let rounded = round::half_up(3.14159, 3);
247/// assert_eq!(rounded, 3.142);
248/// ```
249///
250/// ```
251/// use math::round;
252///
253/// let rounded = round::half_up(3456., -2);
254/// assert_eq!(rounded, 3500.);
255/// ```
256pub fn half_up(value: f64, scale: i8) -> f64 {
257	up_or_down(value, scale, true)
258}
259
260/// Round half randomly up or down.
261///
262/// Round `value` to accuracy defined by `scale`
263/// rounding half randomly up or down.
264/// Positive `scale` defines the number of decimal digits in the result
265/// while negative `scale` rounds to a whole number and defines the number
266/// of trailing zeroes in the result.
267///
268/// # Arguments
269///
270/// * `value` - value to round
271/// * `scale` - result accuracy
272///
273/// # Examples
274///
275/// ```
276/// use math::round;
277///
278/// let rounded = round::stochastic(3.14159, 3);
279/// assert_eq!(rounded == 3.141 || rounded == 3.142, true);
280/// ```
281///
282/// ```
283/// use math::round;
284///
285/// let rounded = round::stochastic(3456., -2);
286/// assert_eq!(rounded == 3400. || rounded == 3500., true);
287/// ```
288pub fn stochastic(value: f64, scale: i8) -> f64 {
289	let digits = significant_digits(value, scale);
290	to_nearest(value, scale, digits.1)
291}
292
293fn even_or_odd(value: f64, scale: i8, even: bool) -> f64 {
294	let digits = significant_digits(value, scale);
295	match digits.1 == 5 {
296		true => round(value, scale, (value < 0.) ^ even ^ (digits.0 % 2 == 0)),
297		false => to_nearest(value, scale, digits.1),
298	}
299}
300
301fn round(value: f64, scale: i8, up: bool) -> f64 {
302	match up {
303		true => ceil(value, scale),
304		false => floor(value, scale),
305	}
306}
307
308fn significant_digits(value: f64, scale: i8) -> (u8, u8) {
309	if value.is_nan() || value.is_infinite() {
310		return (0, 0);
311	}
312	let v = value.abs();
313	let m = 10f64.powi(scale as i32 + 2);
314	let f = 10f64.powi(-1 * (scale as i32 + 1));
315	let a = (v * m) as i64;
316	let b = ((v + f) * m) as i64;
317	let c = ((v - f) * m) as i64;
318	let r = match b - a > a - c {
319		true => a / 10 + 1,
320		false => a / 10,
321	};
322	((r / 10 % 10) as u8, (r % 10) as u8)
323}
324
325fn to_nearest(value: f64, scale: i8, digit: u8) -> f64 {
326	let up = match digit == 5 {
327		true => rand::random::<bool>(),
328		false => (value < 0.) ^ (digit > 5),
329	};
330	round(value, scale, up)
331}
332
333fn towards_zero(value: f64, scale: i8, towards: bool) -> f64 {
334	let digits = significant_digits(value, scale);
335	match digits.1 == 5 {
336		true => round(value, scale, (value < 0.) ^ !towards),
337		false => to_nearest(value, scale, digits.1),
338	}
339}
340
341fn up_or_down(value: f64, scale: i8, up: bool) -> f64 {
342	let digits = significant_digits(value, scale);
343	match digits.1 == 5 {
344		true => round(value, scale, up),
345		false => to_nearest(value, scale, digits.1),
346	}
347}
348
349#[cfg(test)]
350mod tests {
351	use std::f64::{ NAN, INFINITY, NEG_INFINITY };
352
353	macro_rules! test_round {
354		($func:path [ $($name:ident: $params:expr,)* ]) => {
355		$(
356			#[test]
357			fn $name() {
358				let (value, scale, expected): (f64, i8, f64) = $params;
359				let result = $func(value, scale);
360				match result.is_nan() {
361					true => assert_eq!(expected.is_nan(), true),
362					false => assert_eq!(result, expected),
363				}
364			}
365		)*
366		}
367	}
368
369	macro_rules! test_digits {
370		($func:path [ $($name:ident: $params:expr,)* ]) => {
371		$(
372			#[test]
373			fn $name() {
374				let (value, scale, expected): (f64, i8, (u8, u8)) = $params;
375				assert_eq!($func(value, scale), expected);
376			}
377		)*
378		}
379	}
380
381	test_round! { super::ceil [
382		ceil_1: (-1.03, 1, -1.),
383		ceil_2: (-1.05, 1, -1.),
384		ceil_3: (-1.07, 1, -1.),
385		ceil_4: (-1.13, 1, -1.1),
386		ceil_5: (-1.15, 1, -1.1),
387		ceil_6: (-1.17, 1, -1.1),
388		ceil_7: (-1.23, 1, -1.2),
389		ceil_8: (-1.25, 1, -1.2),
390		ceil_9: (-1.27, 1, -1.2),
391		ceil_10: (-1.33, 1, -1.3),
392		ceil_11: (-1.35, 1, -1.3),
393		ceil_12: (-1.37, 1, -1.3),
394		ceil_13: (1.03, 1, 1.1),
395		ceil_14: (1.05, 1, 1.1),
396		ceil_15: (1.07, 1, 1.1),
397		ceil_16: (1.13, 1, 1.2),
398		ceil_17: (1.15, 1, 1.2),
399		ceil_18: (1.17, 1, 1.2),
400		ceil_19: (1.23, 1, 1.3),
401		ceil_20: (1.25, 1, 1.3),
402		ceil_21: (1.27, 1, 1.3),
403		ceil_22: (1.33, 1, 1.4),
404		ceil_23: (1.35, 1, 1.4),
405		ceil_24: (1.37, 1, 1.4),
406		ceil_25: (INFINITY, 1, INFINITY),
407		ceil_26: (NAN, 1, NAN),
408		ceil_27: (NEG_INFINITY, 1, NEG_INFINITY),
409		ceil_28: (-103., -1, -100.),
410		ceil_29: (-105., -1, -100.),
411		ceil_30: (-107., -1, -100.),
412		ceil_31: (-113., -1, -110.),
413		ceil_32: (-115., -1, -110.),
414		ceil_33: (-117., -1, -110.),
415		ceil_34: (-123., -1, -120.),
416		ceil_35: (-125., -1, -120.),
417		ceil_36: (-127., -1, -120.),
418		ceil_37: (-133., -1, -130.),
419		ceil_38: (-135., -1, -130.),
420		ceil_39: (-137., -1, -130.),
421		ceil_40: (103., -1, 110.),
422		ceil_41: (105., -1, 110.),
423		ceil_42: (107., -1, 110.),
424		ceil_43: (113., -1, 120.),
425		ceil_44: (115., -1, 120.),
426		ceil_45: (117., -1, 120.),
427		ceil_46: (123., -1, 130.),
428		ceil_47: (125., -1, 130.),
429		ceil_48: (127., -1, 130.),
430		ceil_49: (133., -1, 140.),
431		ceil_50: (135., -1, 140.),
432		ceil_51: (137., -1, 140.),
433		ceil_52: (INFINITY, -1, INFINITY),
434		ceil_53: (NAN, -1, NAN),
435		ceil_54: (NEG_INFINITY, -1, NEG_INFINITY),
436	]}
437
438	test_round! { super::floor [
439		floor_1: (-1.03, 1, -1.1),
440		floor_2: (-1.05, 1, -1.1),
441		floor_3: (-1.07, 1, -1.1),
442		floor_4: (-1.13, 1, -1.2),
443		floor_5: (-1.15, 1, -1.2),
444		floor_6: (-1.17, 1, -1.2),
445		floor_7: (-1.23, 1, -1.3),
446		floor_8: (-1.25, 1, -1.3),
447		floor_9: (-1.27, 1, -1.3),
448		floor_10: (-1.33, 1, -1.4),
449		floor_11: (-1.35, 1, -1.4),
450		floor_12: (-1.37, 1, -1.4),
451		floor_13: (1.03, 1, 1.),
452		floor_14: (1.05, 1, 1.),
453		floor_15: (1.07, 1, 1.),
454		floor_16: (1.13, 1, 1.1),
455		floor_17: (1.15, 1, 1.1),
456		floor_18: (1.17, 1, 1.1),
457		floor_19: (1.23, 1, 1.2),
458		floor_20: (1.25, 1, 1.2),
459		floor_21: (1.27, 1, 1.2),
460		floor_22: (1.33, 1, 1.3),
461		floor_23: (1.35, 1, 1.3),
462		floor_24: (1.37, 1, 1.3),
463		floor_25: (INFINITY, 1, INFINITY),
464		floor_26: (NAN, 1, NAN),
465		floor_27: (NEG_INFINITY, 1, NEG_INFINITY),
466		floor_28: (-103., -1, -110.),
467		floor_29: (-105., -1, -110.),
468		floor_30: (-107., -1, -110.),
469		floor_31: (-113., -1, -120.),
470		floor_32: (-115., -1, -120.),
471		floor_33: (-117., -1, -120.),
472		floor_34: (-123., -1, -130.),
473		floor_35: (-125., -1, -130.),
474		floor_36: (-127., -1, -130.),
475		floor_37: (-133., -1, -140.),
476		floor_38: (-135., -1, -140.),
477		floor_39: (-137., -1, -140.),
478		floor_40: (103., -1, 100.),
479		floor_41: (105., -1, 100.),
480		floor_42: (107., -1, 100.),
481		floor_43: (113., -1, 110.),
482		floor_44: (115., -1, 110.),
483		floor_45: (117., -1, 110.),
484		floor_46: (123., -1, 120.),
485		floor_47: (125., -1, 120.),
486		floor_48: (127., -1, 120.),
487		floor_49: (133., -1, 130.),
488		floor_50: (135., -1, 130.),
489		floor_51: (137., -1, 130.),
490		floor_52: (INFINITY, -1, INFINITY),
491		floor_53: (NAN, -1, NAN),
492		floor_54: (NEG_INFINITY, -1, NEG_INFINITY),
493	]}
494
495	test_round! { super::half_away_from_zero [
496		half_away_from_zero_1: (-1.03, 1, -1.),
497		half_away_from_zero_2: (-1.05, 1, -1.1),
498		half_away_from_zero_3: (-1.07, 1, -1.1),
499		half_away_from_zero_4: (-1.13, 1, -1.1),
500		half_away_from_zero_5: (-1.15, 1, -1.2),
501		half_away_from_zero_6: (-1.17, 1, -1.2),
502		half_away_from_zero_7: (-1.23, 1, -1.2),
503		half_away_from_zero_8: (-1.25, 1, -1.3),
504		half_away_from_zero_9: (-1.27, 1, -1.3),
505		half_away_from_zero_10: (-1.33, 1, -1.3),
506		half_away_from_zero_11: (-1.35, 1, -1.4),
507		half_away_from_zero_12: (-1.37, 1, -1.4),
508		half_away_from_zero_13: (1.03, 1, 1.),
509		half_away_from_zero_14: (1.05, 1, 1.1),
510		half_away_from_zero_15: (1.07, 1, 1.1),
511		half_away_from_zero_16: (1.13, 1, 1.1),
512		half_away_from_zero_17: (1.15, 1, 1.2),
513		half_away_from_zero_18: (1.17, 1, 1.2),
514		half_away_from_zero_19: (1.23, 1, 1.2),
515		half_away_from_zero_20: (1.25, 1, 1.3),
516		half_away_from_zero_21: (1.27, 1, 1.3),
517		half_away_from_zero_22: (1.33, 1, 1.3),
518		half_away_from_zero_23: (1.35, 1, 1.4),
519		half_away_from_zero_24: (1.37, 1, 1.4),
520		half_away_from_zero_25: (INFINITY, 1, INFINITY),
521		half_away_from_zero_26: (NAN, 1, NAN),
522		half_away_from_zero_27: (NEG_INFINITY, 1, NEG_INFINITY),
523		half_away_from_zero_28: (-103., -1, -100.),
524		half_away_from_zero_29: (-105., -1, -110.),
525		half_away_from_zero_30: (-107., -1, -110.),
526		half_away_from_zero_31: (-113., -1, -110.),
527		half_away_from_zero_32: (-115., -1, -120.),
528		half_away_from_zero_33: (-117., -1, -120.),
529		half_away_from_zero_34: (-123., -1, -120.),
530		half_away_from_zero_35: (-125., -1, -130.),
531		half_away_from_zero_36: (-127., -1, -130.),
532		half_away_from_zero_37: (-133., -1, -130.),
533		half_away_from_zero_38: (-135., -1, -140.),
534		half_away_from_zero_39: (-137., -1, -140.),
535		half_away_from_zero_40: (103., -1, 100.),
536		half_away_from_zero_41: (105., -1, 110.),
537		half_away_from_zero_42: (107., -1, 110.),
538		half_away_from_zero_43: (113., -1, 110.),
539		half_away_from_zero_44: (115., -1, 120.),
540		half_away_from_zero_45: (117., -1, 120.),
541		half_away_from_zero_46: (123., -1, 120.),
542		half_away_from_zero_47: (125., -1, 130.),
543		half_away_from_zero_48: (127., -1, 130.),
544		half_away_from_zero_49: (133., -1, 130.),
545		half_away_from_zero_50: (135., -1, 140.),
546		half_away_from_zero_51: (137., -1, 140.),
547		half_away_from_zero_52: (INFINITY, -1, INFINITY),
548		half_away_from_zero_53: (NAN, -1, NAN),
549		half_away_from_zero_54: (NEG_INFINITY, -1, NEG_INFINITY),
550	]}
551
552	test_round! { super::half_down [
553		half_down_1: (-1.03, 1, -1.),
554		half_down_2: (-1.05, 1, -1.1),
555		half_down_3: (-1.07, 1, -1.1),
556		half_down_4: (-1.13, 1, -1.1),
557		half_down_5: (-1.15, 1, -1.2),
558		half_down_6: (-1.17, 1, -1.2),
559		half_down_7: (-1.23, 1, -1.2),
560		half_down_8: (-1.25, 1, -1.3),
561		half_down_9: (-1.27, 1, -1.3),
562		half_down_10: (-1.33, 1, -1.3),
563		half_down_11: (-1.35, 1, -1.4),
564		half_down_12: (-1.37, 1, -1.4),
565		half_down_13: (1.03, 1, 1.),
566		half_down_14: (1.05, 1, 1.),
567		half_down_15: (1.07, 1, 1.1),
568		half_down_16: (1.13, 1, 1.1),
569		half_down_17: (1.15, 1, 1.1),
570		half_down_18: (1.17, 1, 1.2),
571		half_down_19: (1.23, 1, 1.2),
572		half_down_20: (1.25, 1, 1.2),
573		half_down_21: (1.27, 1, 1.3),
574		half_down_22: (1.33, 1, 1.3),
575		half_down_23: (1.35, 1, 1.3),
576		half_down_24: (1.37, 1, 1.4),
577		half_down_25: (INFINITY, 1, INFINITY),
578		half_down_26: (NAN, 1, NAN),
579		half_down_27: (NEG_INFINITY, 1, NEG_INFINITY),
580		half_down_28: (-103., -1, -100.),
581		half_down_29: (-105., -1, -110.),
582		half_down_30: (-107., -1, -110.),
583		half_down_31: (-113., -1, -110.),
584		half_down_32: (-115., -1, -120.),
585		half_down_33: (-117., -1, -120.),
586		half_down_34: (-123., -1, -120.),
587		half_down_35: (-125., -1, -130.),
588		half_down_36: (-127., -1, -130.),
589		half_down_37: (-133., -1, -130.),
590		half_down_38: (-135., -1, -140.),
591		half_down_39: (-137., -1, -140.),
592		half_down_40: (103., -1, 100.),
593		half_down_41: (105., -1, 100.),
594		half_down_42: (107., -1, 110.),
595		half_down_43: (113., -1, 110.),
596		half_down_44: (115., -1, 110.),
597		half_down_45: (117., -1, 120.),
598		half_down_46: (123., -1, 120.),
599		half_down_47: (125., -1, 120.),
600		half_down_48: (127., -1, 130.),
601		half_down_49: (133., -1, 130.),
602		half_down_50: (135., -1, 130.),
603		half_down_51: (137., -1, 140.),
604		half_down_52: (INFINITY, -1, INFINITY),
605		half_down_53: (NAN, -1, NAN),
606		half_down_54: (NEG_INFINITY, -1, NEG_INFINITY),
607	]}
608
609	test_round! { super::half_to_even [
610		half_to_even_1: (-1.03, 1, -1.),
611		half_to_even_2: (-1.05, 1, -1.),
612		half_to_even_3: (-1.07, 1, -1.1),
613		half_to_even_4: (-1.13, 1, -1.1),
614		half_to_even_5: (-1.15, 1, -1.2),
615		half_to_even_6: (-1.17, 1, -1.2),
616		half_to_even_7: (-1.23, 1, -1.2),
617		half_to_even_8: (-1.25, 1, -1.2),
618		half_to_even_9: (-1.27, 1, -1.3),
619		half_to_even_10: (-1.33, 1, -1.3),
620		half_to_even_11: (-1.35, 1, -1.4),
621		half_to_even_12: (-1.37, 1, -1.4),
622		half_to_even_13: (1.03, 1, 1.),
623		half_to_even_14: (1.05, 1, 1.),
624		half_to_even_15: (1.07, 1, 1.1),
625		half_to_even_16: (1.13, 1, 1.1),
626		half_to_even_17: (1.15, 1, 1.2),
627		half_to_even_18: (1.17, 1, 1.2),
628		half_to_even_19: (1.23, 1, 1.2),
629		half_to_even_20: (1.25, 1, 1.2),
630		half_to_even_21: (1.27, 1, 1.3),
631		half_to_even_22: (1.33, 1, 1.3),
632		half_to_even_23: (1.35, 1, 1.4),
633		half_to_even_24: (1.37, 1, 1.4),
634		half_to_even_25: (INFINITY, 1, INFINITY),
635		half_to_even_26: (NAN, 1, NAN),
636		half_to_even_27: (NEG_INFINITY, 1, NEG_INFINITY),
637		half_to_even_28: (2.221000, 3, 2.221),
638		half_to_even_29: (-103., -1, -100.),
639		half_to_even_30: (-105., -1, -100.),
640		half_to_even_31: (-107., -1, -110.),
641		half_to_even_32: (-113., -1, -110.),
642		half_to_even_33: (-115., -1, -120.),
643		half_to_even_34: (-117., -1, -120.),
644		half_to_even_35: (-123., -1, -120.),
645		half_to_even_36: (-125., -1, -120.),
646		half_to_even_37: (-127., -1, -130.),
647		half_to_even_38: (-133., -1, -130.),
648		half_to_even_39: (-135., -1, -140.),
649		half_to_even_40: (-137., -1, -140.),
650		half_to_even_41: (103., -1, 100.),
651		half_to_even_42: (105., -1, 100.),
652		half_to_even_43: (107., -1, 110.),
653		half_to_even_44: (113., -1, 110.),
654		half_to_even_45: (115., -1, 120.),
655		half_to_even_46: (117., -1, 120.),
656		half_to_even_47: (123., -1, 120.),
657		half_to_even_48: (125., -1, 120.),
658		half_to_even_49: (127., -1, 130.),
659		half_to_even_50: (133., -1, 130.),
660		half_to_even_51: (135., -1, 140.),
661		half_to_even_52: (137., -1, 140.),
662		half_to_even_53: (INFINITY, -1, INFINITY),
663		half_to_even_54: (NAN, -1, NAN),
664		half_to_even_55: (NEG_INFINITY, -1, NEG_INFINITY),
665	]}
666
667	test_round! { super::half_to_odd [
668		half_to_odd_1: (-1.03, 1, -1.),
669		half_to_odd_2: (-1.05, 1, -1.1),
670		half_to_odd_3: (-1.07, 1, -1.1),
671		half_to_odd_4: (-1.13, 1, -1.1),
672		half_to_odd_5: (-1.15, 1, -1.1),
673		half_to_odd_6: (-1.17, 1, -1.2),
674		half_to_odd_7: (-1.23, 1, -1.2),
675		half_to_odd_8: (-1.25, 1, -1.3),
676		half_to_odd_9: (-1.27, 1, -1.3),
677		half_to_odd_10: (-1.33, 1, -1.3),
678		half_to_odd_11: (-1.35, 1, -1.3),
679		half_to_odd_12: (-1.37, 1, -1.4),
680		half_to_odd_13: (1.03, 1, 1.),
681		half_to_odd_14: (1.05, 1, 1.1),
682		half_to_odd_15: (1.07, 1, 1.1),
683		half_to_odd_16: (1.13, 1, 1.1),
684		half_to_odd_17: (1.15, 1, 1.1),
685		half_to_odd_18: (1.17, 1, 1.2),
686		half_to_odd_19: (1.23, 1, 1.2),
687		half_to_odd_20: (1.25, 1, 1.3),
688		half_to_odd_21: (1.27, 1, 1.3),
689		half_to_odd_22: (1.33, 1, 1.3),
690		half_to_odd_23: (1.35, 1, 1.3),
691		half_to_odd_24: (1.37, 1, 1.4),
692		half_to_odd_25: (INFINITY, 1, INFINITY),
693		half_to_odd_26: (NAN, 1, NAN),
694		half_to_odd_27: (NEG_INFINITY, 1, NEG_INFINITY),
695		half_to_odd_28: (-103., -1, -100.),
696		half_to_odd_29: (-105., -1, -110.),
697		half_to_odd_30: (-107., -1, -110.),
698		half_to_odd_31: (-113., -1, -110.),
699		half_to_odd_32: (-115., -1, -110.),
700		half_to_odd_33: (-117., -1, -120.),
701		half_to_odd_34: (-123., -1, -120.),
702		half_to_odd_35: (-125., -1, -130.),
703		half_to_odd_36: (-127., -1, -130.),
704		half_to_odd_37: (-133., -1, -130.),
705		half_to_odd_38: (-135., -1, -130.),
706		half_to_odd_39: (-137., -1, -140.),
707		half_to_odd_40: (103., -1, 100.),
708		half_to_odd_41: (105., -1, 110.),
709		half_to_odd_42: (107., -1, 110.),
710		half_to_odd_43: (113., -1, 110.),
711		half_to_odd_44: (115., -1, 110.),
712		half_to_odd_45: (117., -1, 120.),
713		half_to_odd_46: (123., -1, 120.),
714		half_to_odd_47: (125., -1, 130.),
715		half_to_odd_48: (127., -1, 130.),
716		half_to_odd_49: (133., -1, 130.),
717		half_to_odd_50: (135., -1, 130.),
718		half_to_odd_51: (137., -1, 140.),
719		half_to_odd_52: (INFINITY, -1, INFINITY),
720		half_to_odd_53: (NAN, -1, NAN),
721		half_to_odd_54: (NEG_INFINITY, -1, NEG_INFINITY),
722	]}
723
724	test_round! { super::half_towards_zero [
725		half_towards_zero_1: (-1.03, 1, -1.),
726		half_towards_zero_2: (-1.05, 1, -1.),
727		half_towards_zero_3: (-1.07, 1, -1.1),
728		half_towards_zero_4: (-1.13, 1, -1.1),
729		half_towards_zero_5: (-1.15, 1, -1.1),
730		half_towards_zero_6: (-1.17, 1, -1.2),
731		half_towards_zero_7: (-1.23, 1, -1.2),
732		half_towards_zero_8: (-1.25, 1, -1.2),
733		half_towards_zero_9: (-1.27, 1, -1.3),
734		half_towards_zero_10: (-1.33, 1, -1.3),
735		half_towards_zero_11: (-1.35, 1, -1.3),
736		half_towards_zero_12: (-1.37, 1, -1.4),
737		half_towards_zero_13: (1.03, 1, 1.),
738		half_towards_zero_14: (1.05, 1, 1.),
739		half_towards_zero_15: (1.07, 1, 1.1),
740		half_towards_zero_16: (1.13, 1, 1.1),
741		half_towards_zero_17: (1.15, 1, 1.1),
742		half_towards_zero_18: (1.17, 1, 1.2),
743		half_towards_zero_19: (1.23, 1, 1.2),
744		half_towards_zero_20: (1.25, 1, 1.2),
745		half_towards_zero_21: (1.27, 1, 1.3),
746		half_towards_zero_22: (1.33, 1, 1.3),
747		half_towards_zero_23: (1.35, 1, 1.3),
748		half_towards_zero_24: (1.37, 1, 1.4),
749		half_towards_zero_25: (INFINITY, 1, INFINITY),
750		half_towards_zero_26: (NAN, 1, NAN),
751		half_towards_zero_27: (NEG_INFINITY, 1, NEG_INFINITY),
752		half_towards_zero_28: (-103., -1, -100.),
753		half_towards_zero_29: (-105., -1, -100.),
754		half_towards_zero_30: (-107., -1, -110.),
755		half_towards_zero_31: (-113., -1, -110.),
756		half_towards_zero_32: (-115., -1, -110.),
757		half_towards_zero_33: (-117., -1, -120.),
758		half_towards_zero_34: (-123., -1, -120.),
759		half_towards_zero_35: (-125., -1, -120.),
760		half_towards_zero_36: (-127., -1, -130.),
761		half_towards_zero_37: (-133., -1, -130.),
762		half_towards_zero_38: (-135., -1, -130.),
763		half_towards_zero_39: (-137., -1, -140.),
764		half_towards_zero_40: (103., -1, 100.),
765		half_towards_zero_41: (105., -1, 100.),
766		half_towards_zero_42: (107., -1, 110.),
767		half_towards_zero_43: (113., -1, 110.),
768		half_towards_zero_44: (115., -1, 110.),
769		half_towards_zero_45: (117., -1, 120.),
770		half_towards_zero_46: (123., -1, 120.),
771		half_towards_zero_47: (125., -1, 120.),
772		half_towards_zero_48: (127., -1, 130.),
773		half_towards_zero_49: (133., -1, 130.),
774		half_towards_zero_50: (135., -1, 130.),
775		half_towards_zero_51: (137., -1, 140.),
776		half_towards_zero_52: (INFINITY, -1, INFINITY),
777		half_towards_zero_53: (NAN, -1, NAN),
778		half_towards_zero_54: (NEG_INFINITY, -1, NEG_INFINITY),
779	]}
780
781	test_round! { super::half_up [
782		half_up_1: (-1.03, 1, -1.),
783		half_up_2: (-1.05, 1, -1.),
784		half_up_3: (-1.07, 1, -1.1),
785		half_up_4: (-1.13, 1, -1.1),
786		half_up_5: (-1.15, 1, -1.1),
787		half_up_6: (-1.17, 1, -1.2),
788		half_up_7: (-1.23, 1, -1.2),
789		half_up_8: (-1.25, 1, -1.2),
790		half_up_9: (-1.27, 1, -1.3),
791		half_up_10: (-1.33, 1, -1.3),
792		half_up_11: (-1.35, 1, -1.3),
793		half_up_12: (-1.37, 1, -1.4),
794		half_up_13: (1.03, 1, 1.),
795		half_up_14: (1.05, 1, 1.1),
796		half_up_15: (1.07, 1, 1.1),
797		half_up_16: (1.13, 1, 1.1),
798		half_up_17: (1.15, 1, 1.2),
799		half_up_18: (1.17, 1, 1.2),
800		half_up_19: (1.23, 1, 1.2),
801		half_up_20: (1.25, 1, 1.3),
802		half_up_21: (1.27, 1, 1.3),
803		half_up_22: (1.33, 1, 1.3),
804		half_up_23: (1.35, 1, 1.4),
805		half_up_24: (1.37, 1, 1.4),
806		half_up_25: (INFINITY, 1, INFINITY),
807		half_up_26: (NAN, 1, NAN),
808		half_up_27: (NEG_INFINITY, 1, NEG_INFINITY),
809		half_up_28: (-103., -1, -100.),
810		half_up_29: (-105., -1, -100.),
811		half_up_30: (-107., -1, -110.),
812		half_up_31: (-113., -1, -110.),
813		half_up_32: (-115., -1, -110.),
814		half_up_33: (-117., -1, -120.),
815		half_up_34: (-123., -1, -120.),
816		half_up_35: (-125., -1, -120.),
817		half_up_36: (-127., -1, -130.),
818		half_up_37: (-133., -1, -130.),
819		half_up_38: (-135., -1, -130.),
820		half_up_39: (-137., -1, -140.),
821		half_up_40: (103., -1, 100.),
822		half_up_41: (105., -1, 110.),
823		half_up_42: (107., -1, 110.),
824		half_up_43: (113., -1, 110.),
825		half_up_44: (115., -1, 120.),
826		half_up_45: (117., -1, 120.),
827		half_up_46: (123., -1, 120.),
828		half_up_47: (125., -1, 130.),
829		half_up_48: (127., -1, 130.),
830		half_up_49: (133., -1, 130.),
831		half_up_50: (135., -1, 140.),
832		half_up_51: (137., -1, 140.),
833		half_up_52: (INFINITY, -1, INFINITY),
834		half_up_53: (NAN, -1, NAN),
835		half_up_54: (NEG_INFINITY, -1, NEG_INFINITY),
836	]}
837
838	test_digits! { super::significant_digits [
839		significant_digits_1: (-1.1234567890, 0, (1, 1)),
840		significant_digits_2: (-1.1234567890, 1, (1, 2)),
841		significant_digits_3: (-1.1234567890, 2, (2, 3)),
842		significant_digits_4: (-1.1234567890, 3, (3, 4)),
843		significant_digits_5: (-1.1234567890, 4, (4, 5)),
844		significant_digits_6: (-1.1234567890, 5, (5, 6)),
845		significant_digits_7: (-1.1234567890, 6, (6, 7)),
846		significant_digits_8: (-1.1234567890, 7, (7, 8)),
847		significant_digits_9: (-1.1234567890, 8, (8, 9)),
848		significant_digits_10: (-1.1234567890, 9, (9, 0)),
849		significant_digits_11: (1.1234567890, 0, (1, 1)),
850		significant_digits_12: (1.1234567890, 1, (1, 2)),
851		significant_digits_13: (1.1234567890, 2, (2, 3)),
852		significant_digits_14: (1.1234567890, 3, (3, 4)),
853		significant_digits_15: (1.1234567890, 4, (4, 5)),
854		significant_digits_16: (1.1234567890, 5, (5, 6)),
855		significant_digits_17: (1.1234567890, 6, (6, 7)),
856		significant_digits_18: (1.1234567890, 7, (7, 8)),
857		significant_digits_19: (1.1234567890, 8, (8, 9)),
858		significant_digits_20: (1.1234567890, 9, (9, 0)),
859		significant_digits_21: (-1.15, 1, (1, 5)),
860		significant_digits_22: (1.15, 1, (1, 5)),
861		significant_digits_23: (1.9999, 3, (9, 9)),
862		significant_digits_24: (INFINITY, 1, (0, 0)),
863		significant_digits_25: (NAN, 1, (0, 0)),
864		significant_digits_26: (NEG_INFINITY, 1, (0, 0)),
865		significant_digits_27: (-1234567890., 0, (0, 0)),
866		significant_digits_28: (-1234567890., -1, (9, 0)),
867		significant_digits_29: (-1234567890., -2, (8, 9)),
868		significant_digits_30: (-1234567890., -3, (7, 8)),
869		significant_digits_31: (-1234567890., -4, (6, 7)),
870		significant_digits_32: (-1234567890., -5, (5, 6)),
871		significant_digits_33: (-1234567890., -6, (4, 5)),
872		significant_digits_34: (-1234567890., -7, (3, 4)),
873		significant_digits_35: (-1234567890., -8, (2, 3)),
874		significant_digits_36: (-1234567890., -9, (1, 2)),
875		significant_digits_37: (1234567890., 0, (0, 0)),
876		significant_digits_38: (1234567890., -1, (9, 0)),
877		significant_digits_39: (1234567890., -2, (8, 9)),
878		significant_digits_40: (1234567890., -3, (7, 8)),
879		significant_digits_41: (1234567890., -4, (6, 7)),
880		significant_digits_42: (1234567890., -5, (5, 6)),
881		significant_digits_43: (1234567890., -6, (4, 5)),
882		significant_digits_44: (1234567890., -7, (3, 4)),
883		significant_digits_45: (1234567890., -8, (2, 3)),
884		significant_digits_46: (1234567890., -9, (1, 2)),
885		significant_digits_47: (INFINITY, -1, (0, 0)),
886		significant_digits_48: (NAN, -1, (0, 0)),
887		significant_digits_49: (NEG_INFINITY, -1, (0, 0)),
888		significant_digits_50: (0.011, 2, (1, 1)),
889		significant_digits_51: (0.014, 2, (1, 4)),
890		significant_digits_52: (0.017, 2, (1, 7)),
891		significant_digits_53: (0.018, 2, (1, 8)),
892		significant_digits_54: (1.015, 2, (1, 5)),
893		significant_digits_55: (1.013, 2, (1, 3)),
894		significant_digits_56: (1.017, 2, (1, 7)),
895		significant_digits_57: (1.019, 2, (1, 9)),
896		significant_digits_58: (-0.011, 2, (1, 1)),
897		significant_digits_59: (-0.014, 2, (1, 4)),
898		significant_digits_60: (-0.017, 2, (1, 7)),
899		significant_digits_61: (-0.018, 2, (1, 8)),
900		significant_digits_62: (-1.015, 2, (1, 5)),
901		significant_digits_63: (-1.013, 2, (1, 3)),
902		significant_digits_64: (-1.017, 2, (1, 7)),
903		significant_digits_65: (-1.019, 2, (1, 9)),
904	]}
905}