@@ -21,7 +21,6 @@ const NANOS_PER_MILLI: u32 = 1_000_000;
21
21
const NANOS_PER_MICRO : u32 = 1_000 ;
22
22
const MILLIS_PER_SEC : u64 = 1_000 ;
23
23
const MICROS_PER_SEC : u64 = 1_000_000 ;
24
- const MAX_NANOS_F64 : f64 = ( ( u64:: MAX as u128 + 1 ) * ( NANOS_PER_SEC as u128 ) ) as f64 ;
25
24
26
25
/// A `Duration` type to represent a span of time, typically used for system
27
26
/// timeouts.
@@ -510,15 +509,34 @@ impl Duration {
510
509
/// use std::time::Duration;
511
510
///
512
511
/// let dur = Duration::new(2, 700_000_000);
513
- /// assert_eq!(dur.as_float_secs (), 2.7);
512
+ /// assert_eq!(dur.as_secs_f64 (), 2.7);
514
513
/// ```
515
514
#[ unstable( feature = "duration_float" , issue = "54361" ) ]
516
515
#[ inline]
517
- pub const fn as_float_secs ( & self ) -> f64 {
516
+ pub const fn as_secs_f64 ( & self ) -> f64 {
518
517
( self . secs as f64 ) + ( self . nanos as f64 ) / ( NANOS_PER_SEC as f64 )
519
518
}
520
519
521
- /// Creates a new `Duration` from the specified number of seconds.
520
+ /// Returns the number of seconds contained by this `Duration` as `f32`.
521
+ ///
522
+ /// The returned value does include the fractional (nanosecond) part of the duration.
523
+ ///
524
+ /// # Examples
525
+ /// ```
526
+ /// #![feature(duration_float)]
527
+ /// use std::time::Duration;
528
+ ///
529
+ /// let dur = Duration::new(2, 700_000_000);
530
+ /// assert_eq!(dur.as_secs_f32(), 2.7);
531
+ /// ```
532
+ #[ unstable( feature = "duration_float" , issue = "54361" ) ]
533
+ #[ inline]
534
+ pub const fn as_secs_f32 ( & self ) -> f32 {
535
+ ( self . secs as f32 ) + ( self . nanos as f32 ) / ( NANOS_PER_SEC as f32 )
536
+ }
537
+
538
+ /// Creates a new `Duration` from the specified number of seconds represented
539
+ /// as `f64`.
522
540
///
523
541
/// # Panics
524
542
/// This constructor will panic if `secs` is not finite, negative or overflows `Duration`.
@@ -528,12 +546,14 @@ impl Duration {
528
546
/// #![feature(duration_float)]
529
547
/// use std::time::Duration;
530
548
///
531
- /// let dur = Duration::from_float_secs (2.7);
549
+ /// let dur = Duration::from_secs_f64 (2.7);
532
550
/// assert_eq!(dur, Duration::new(2, 700_000_000));
533
551
/// ```
534
552
#[ unstable( feature = "duration_float" , issue = "54361" ) ]
535
553
#[ inline]
536
- pub fn from_float_secs ( secs : f64 ) -> Duration {
554
+ pub fn from_secs_f64 ( secs : f64 ) -> Duration {
555
+ const MAX_NANOS_F64 : f64 =
556
+ ( ( u64:: MAX as u128 + 1 ) * ( NANOS_PER_SEC as u128 ) ) as f64 ;
537
557
let nanos = secs * ( NANOS_PER_SEC as f64 ) ;
538
558
if !nanos. is_finite ( ) {
539
559
panic ! ( "got non-finite value when converting float to duration" ) ;
@@ -551,6 +571,42 @@ impl Duration {
551
571
}
552
572
}
553
573
574
+ /// Creates a new `Duration` from the specified number of seconds represented
575
+ /// as `f32`.
576
+ ///
577
+ /// # Panics
578
+ /// This constructor will panic if `secs` is not finite, negative or overflows `Duration`.
579
+ ///
580
+ /// # Examples
581
+ /// ```
582
+ /// #![feature(duration_float)]
583
+ /// use std::time::Duration;
584
+ ///
585
+ /// let dur = Duration::from_secs_f32(2.7);
586
+ /// assert_eq!(dur, Duration::new(2, 700_000_000));
587
+ /// ```
588
+ #[ unstable( feature = "duration_float" , issue = "54361" ) ]
589
+ #[ inline]
590
+ pub fn from_secs_f32 ( secs : f32 ) -> Duration {
591
+ const MAX_NANOS_F32 : f32 =
592
+ ( ( u64:: MAX as u128 + 1 ) * ( NANOS_PER_SEC as u128 ) ) as f32 ;
593
+ let nanos = secs * ( NANOS_PER_SEC as f32 ) ;
594
+ if !nanos. is_finite ( ) {
595
+ panic ! ( "got non-finite value when converting float to duration" ) ;
596
+ }
597
+ if nanos >= MAX_NANOS_F32 {
598
+ panic ! ( "overflow when converting float to duration" ) ;
599
+ }
600
+ if nanos < 0.0 {
601
+ panic ! ( "underflow when converting float to duration" ) ;
602
+ }
603
+ let nanos = nanos as u128 ;
604
+ Duration {
605
+ secs : ( nanos / ( NANOS_PER_SEC as u128 ) ) as u64 ,
606
+ nanos : ( nanos % ( NANOS_PER_SEC as u128 ) ) as u32 ,
607
+ }
608
+ }
609
+
554
610
/// Multiplies `Duration` by `f64`.
555
611
///
556
612
/// # Panics
@@ -568,7 +624,29 @@ impl Duration {
568
624
#[ unstable( feature = "duration_float" , issue = "54361" ) ]
569
625
#[ inline]
570
626
pub fn mul_f64 ( self , rhs : f64 ) -> Duration {
571
- Duration :: from_float_secs ( rhs * self . as_float_secs ( ) )
627
+ Duration :: from_secs_f64 ( rhs * self . as_secs_f64 ( ) )
628
+ }
629
+
630
+ /// Multiplies `Duration` by `f32`.
631
+ ///
632
+ /// # Panics
633
+ /// This method will panic if result is not finite, negative or overflows `Duration`.
634
+ ///
635
+ /// # Examples
636
+ /// ```
637
+ /// #![feature(duration_float)]
638
+ /// use std::time::Duration;
639
+ ///
640
+ /// let dur = Duration::new(2, 700_000_000);
641
+ /// // note that due to rounding errors result is slightly different
642
+ /// // from 8.478 and 847800.0
643
+ /// assert_eq!(dur.mul_f32(3.14), Duration::new(8, 478_000_640));
644
+ /// assert_eq!(dur.mul_f32(3.14e5), Duration::new(847799, 969_120_256));
645
+ /// ```
646
+ #[ unstable( feature = "duration_float" , issue = "54361" ) ]
647
+ #[ inline]
648
+ pub fn mul_f32 ( self , rhs : f32 ) -> Duration {
649
+ Duration :: from_secs_f32 ( rhs * self . as_secs_f32 ( ) )
572
650
}
573
651
574
652
/// Divide `Duration` by `f64`.
@@ -589,7 +667,30 @@ impl Duration {
589
667
#[ unstable( feature = "duration_float" , issue = "54361" ) ]
590
668
#[ inline]
591
669
pub fn div_f64 ( self , rhs : f64 ) -> Duration {
592
- Duration :: from_float_secs ( self . as_float_secs ( ) / rhs)
670
+ Duration :: from_secs_f64 ( self . as_secs_f64 ( ) / rhs)
671
+ }
672
+
673
+ /// Divide `Duration` by `f32`.
674
+ ///
675
+ /// # Panics
676
+ /// This method will panic if result is not finite, negative or overflows `Duration`.
677
+ ///
678
+ /// # Examples
679
+ /// ```
680
+ /// #![feature(duration_float)]
681
+ /// use std::time::Duration;
682
+ ///
683
+ /// let dur = Duration::new(2, 700_000_000);
684
+ /// // note that due to rounding errors result is slightly
685
+ /// // different from 0.859_872_611
686
+ /// assert_eq!(dur.div_f32(3.14), Duration::new(0, 859_872_576));
687
+ /// // note that truncation is used, not rounding
688
+ /// assert_eq!(dur.div_f32(3.14e5), Duration::new(0, 8_598));
689
+ /// ```
690
+ #[ unstable( feature = "duration_float" , issue = "54361" ) ]
691
+ #[ inline]
692
+ pub fn div_f32 ( self , rhs : f32 ) -> Duration {
693
+ Duration :: from_secs_f32 ( self . as_secs_f32 ( ) / rhs)
593
694
}
594
695
595
696
/// Divide `Duration` by `Duration` and return `f64`.
@@ -601,12 +702,29 @@ impl Duration {
601
702
///
602
703
/// let dur1 = Duration::new(2, 700_000_000);
603
704
/// let dur2 = Duration::new(5, 400_000_000);
604
- /// assert_eq!(dur1.div_duration(dur2), 0.5);
705
+ /// assert_eq!(dur1.div_duration_f64(dur2), 0.5);
706
+ /// ```
707
+ #[ unstable( feature = "duration_float" , issue = "54361" ) ]
708
+ #[ inline]
709
+ pub fn div_duration_f64 ( self , rhs : Duration ) -> f64 {
710
+ self . as_secs_f64 ( ) / rhs. as_secs_f64 ( )
711
+ }
712
+
713
+ /// Divide `Duration` by `Duration` and return `f32`.
714
+ ///
715
+ /// # Examples
716
+ /// ```
717
+ /// #![feature(duration_float)]
718
+ /// use std::time::Duration;
719
+ ///
720
+ /// let dur1 = Duration::new(2, 700_000_000);
721
+ /// let dur2 = Duration::new(5, 400_000_000);
722
+ /// assert_eq!(dur1.div_duration_f32(dur2), 0.5);
605
723
/// ```
606
724
#[ unstable( feature = "duration_float" , issue = "54361" ) ]
607
725
#[ inline]
608
- pub fn div_duration ( self , rhs : Duration ) -> f64 {
609
- self . as_float_secs ( ) / rhs. as_float_secs ( )
726
+ pub fn div_duration_f32 ( self , rhs : Duration ) -> f32 {
727
+ self . as_secs_f32 ( ) / rhs. as_secs_f32 ( )
610
728
}
611
729
}
612
730
0 commit comments