2015-07-03 2 views
24

В Rust (как и большинство языков программирования) оператор % выполняет операцию , а не модуль . Эти operations have different results for negative numbers:Есть ли функция/операция модуля (не остатка)?

-21 modulus 4 => 3 
-21 remainder 4 => -1 
println!("{}", -21 % 4); // -1 

Однако я хочу остатка.

Обнаружено обходное решение ((a % b) + b) % b, но я не хочу изобретать велосипед, если для этого уже есть функция!

+0

Любая причина использовать термин 'модуль 'вместо' modulo' (который является более распространенным AFAICS). – ideasman42

+0

Они, возможно, изучали где-то, где используется термин модуль, не зная, что разные институты имеют тенденцию отличаться в словаре. – OliverUv

ответ

14

Есть функция (не осталось!) Функция/операция в ржавчине?

Насколько я могу сказать, что нет модульной арифметики функции.

Это также случается в С, например, и обычно используется обходное решение, как вы упомянули: (a % b) + b.

В целом для языков, таких как C, C++, D, C#, F # или Java: % - это на самом деле остаток. Хотя в языках сценариев, таких как Perl, Python или Ruby: % - это модуль.

Разработчики языка не всегда придерживаются «правильного математического пути», поэтому языки компьютеров могут быть вначале странными по строгой математике. Дело в том, что как модуль, так и остаток, верны для разных целей. Модуль является более математичным, если вам нравится, в то время как остаток (в C-семействе) согласуется с общим целочисленным делением, удовлетворяющим: (a/b)*b + a%b = a (и это принято из старого Фортрана). Так % лучше назвать остальные, и я полагаю, Ржавчина быть в соответствии с С.

И очевидно, что вы не первый отметить это, обратите внимание на эти вопросы Rust мерзавца-хаба:

+1

Я, как программист на C/C++, смущен тем, что я не знал, что '%' работает в C таким образом тоже ... – Kapichu

+1

Разве это не разрыв в Rust? – Kapichu

+1

Ну, как вы ожидаете, это не то, что нравится математикам. И я бы не сказал, что это пробел, поскольку все это семейство языков '%' - это просто остаток. – JosEduSol

3

Нет, Ржавчина не имеет встроенного модуля, см. this discussion по некоторым причинам.

Heres пример, который может быть удобным для тех, кто преткновения на этой странице.

/// 
/// Modulo that handles negative numbers, works the same as Python's `%`. 
/// 
/// eg: `(a + b).modulo(c)` 
/// 
pub trait ModuloSignedExt { 
    fn modulo(&self, n: Self) -> Self; 
} 
macro_rules! modulo_signed_ext_impl { 
    ($($t:ty)*) => ($(
     impl ModuloSignedExt for $t { 
      #[inline] 
      fn modulo(&self, n: Self) -> Self { 
       (self % n + n) % n 
      } 
     } 
    )*) 
} 
modulo_signed_ext_impl! { i8 i16 i32 i64 } 

 Смежные вопросы

  • Нет связанных вопросов^_^