From 218eb1277d95090c7db5ba0242194b497784d04e Mon Sep 17 00:00:00 2001 From: William Throwe Date: Sat, 11 Jul 2015 20:30:50 -0400 Subject: [PATCH 1/2] Correct and clarify integer division rounding docs --- src/libcore/num/mod.rs | 8 ++++---- src/libcore/ops.rs | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index fd5ef4b1ccc..c5423019d94 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -459,7 +459,7 @@ macro_rules! int_impl { } } - /// Wrapping (modular) division. Computes `floor(self / other)`, + /// Wrapping (modular) division. Computes `self / other`, /// wrapping around at the boundary of the type. /// /// The only case where such wrapping can occur is when one @@ -467,7 +467,7 @@ macro_rules! int_impl { /// negative minimal value for the type); this is equivalent /// to `-MIN`, a positive value that is too large to represent /// in the type. In such a case, this function returns `MIN` - /// itself.. + /// itself. #[stable(feature = "num_wrapping", since = "1.2.0")] #[inline(always)] pub fn wrapping_div(self, rhs: Self) -> Self { @@ -1031,7 +1031,7 @@ macro_rules! uint_impl { } } - /// Wrapping (modular) division. Computes `floor(self / other)`, + /// Wrapping (modular) division. Computes `self / other`, /// wrapping around at the boundary of the type. /// /// The only case where such wrapping can occur is when one @@ -1039,7 +1039,7 @@ macro_rules! uint_impl { /// negative minimal value for the type); this is equivalent /// to `-MIN`, a positive value that is too large to represent /// in the type. In such a case, this function returns `MIN` - /// itself.. + /// itself. #[stable(feature = "num_wrapping", since = "1.2.0")] #[inline(always)] pub fn wrapping_div(self, rhs: Self) -> Self { diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index 9a22fe3a493..6f15a6bffa8 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -315,6 +315,9 @@ mul_impl! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 } /// The `Div` trait is used to specify the functionality of `/`. /// +/// For primitive integral types, this operation rounds towards zero, +/// truncating any fractional part of the exact result. +/// /// # Examples /// /// A trivial implementation of `Div`. When `Foo / Foo` happens, it ends up @@ -369,6 +372,9 @@ div_impl! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 } /// The `Rem` trait is used to specify the functionality of `%`. /// +/// For primitive integral types, this operation satisfies `n % d == n +/// - (n / d) * d`. The result has the same sign as the left operand. +/// /// # Examples /// /// A trivial implementation of `Rem`. When `Foo % Foo` happens, it ends up From 7824956effbfaccea5f6ce0b973c26cb58d241f9 Mon Sep 17 00:00:00 2001 From: William Throwe Date: Sun, 12 Jul 2015 20:28:16 -0400 Subject: [PATCH 2/2] Move rounding discussion to integer Div/Rem impls --- src/libcore/ops.rs | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index 6f15a6bffa8..76d3c1df159 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -315,9 +315,6 @@ mul_impl! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 } /// The `Div` trait is used to specify the functionality of `/`. /// -/// For primitive integral types, this operation rounds towards zero, -/// truncating any fractional part of the exact result. -/// /// # Examples /// /// A trivial implementation of `Div`. When `Foo / Foo` happens, it ends up @@ -354,7 +351,25 @@ pub trait Div { fn div(self, rhs: RHS) -> Self::Output; } -macro_rules! div_impl { +macro_rules! div_impl_integer { + ($($t:ty)*) => ($( + /// This operation rounds towards zero, truncating any + /// fractional part of the exact result. + #[stable(feature = "rust1", since = "1.0.0")] + impl Div for $t { + type Output = $t; + + #[inline] + fn div(self, other: $t) -> $t { self / other } + } + + forward_ref_binop! { impl Div, div for $t, $t } + )*) +} + +div_impl_integer! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 } + +macro_rules! div_impl_float { ($($t:ty)*) => ($( #[stable(feature = "rust1", since = "1.0.0")] impl Div for $t { @@ -368,13 +383,10 @@ macro_rules! div_impl { )*) } -div_impl! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 } +div_impl_float! { f32 f64 } /// The `Rem` trait is used to specify the functionality of `%`. /// -/// For primitive integral types, this operation satisfies `n % d == n -/// - (n / d) * d`. The result has the same sign as the left operand. -/// /// # Examples /// /// A trivial implementation of `Rem`. When `Foo % Foo` happens, it ends up @@ -413,6 +425,8 @@ pub trait Rem { macro_rules! rem_impl { ($($t:ty)*) => ($( + /// This operation satisfies `n % d == n - (n / d) * d`. The + /// result has the same sign as the left operand. #[stable(feature = "rust1", since = "1.0.0")] impl Rem for $t { type Output = $t;