1extern crate rand;
3
4pub fn ceil(value: f64, scale: i8) -> f64 {
32 let multiplier = 10f64.powi(scale as i32) as f64;
33 (value * multiplier).ceil() / multiplier
34}
35
36pub fn floor(value: f64, scale: i8) -> f64 {
64 let multiplier = 10f64.powi(scale as i32) as f64;
65 (value * multiplier).floor() / multiplier
66}
67
68pub fn half_away_from_zero(value: f64, scale: i8) -> f64 {
97 towards_zero(value, scale, false)
98}
99
100pub fn half_down(value: f64, scale: i8) -> f64 {
129 up_or_down(value, scale, false)
130}
131
132pub fn half_to_even(value: f64, scale: i8) -> f64 {
161 even_or_odd(value, scale, true)
162}
163
164pub fn half_to_odd(value: f64, scale: i8) -> f64 {
193 even_or_odd(value, scale, false)
194}
195
196pub fn half_towards_zero(value: f64, scale: i8) -> f64 {
225 towards_zero(value, scale, true)
226}
227
228pub fn half_up(value: f64, scale: i8) -> f64 {
257 up_or_down(value, scale, true)
258}
259
260pub 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}