11.11.2015 Взять и поделить или деление по модулю

Материал из SRNS
Перейти к: навигация, поиск
(Ссылки)
Строка 6: Строка 6:
 
{{TOCright}}
 
{{TOCright}}
  
Есть некоторая неуверенность в результатах работы функций взятия по модулю, для борьбы с которой составлена эта памятка.  
+
Есть некоторая неуверенность в результатах работы функций взятия модуля, для борьбы с которой составлена эта памятка.  
  
 
Лично я привык к работе функции mod(a, b) в MATLAB, которая приводит a к диапазону [0 b] или [b 0] (в зависимости от знака b) путем прибавления/вычитания целого числа b к/из a. Что выражается в формуле:
 
Лично я привык к работе функции mod(a, b) в MATLAB, которая приводит a к диапазону [0 b] или [b 0] (в зависимости от знака b) путем прибавления/вычитания целого числа b к/из a. Что выражается в формуле:
Строка 12: Строка 12:
 
где функция floor - округление в сторону минус бесконечности.  
 
где функция floor - округление в сторону минус бесконечности.  
  
Как оказалось, следует отличать понятия остатка от деления<ref>[https://ru.wikipedia.org/wiki/Деление_с_остатком Wiki: Деление с остатком]</ref> и взятия по модулю. В первом случае мы приводим число к диапазону [0 |b|].
+
Как оказалось, следует отличать понятия ''остатка от деления (remainder after devision)''<ref>[https://ru.wikipedia.org/wiki/Деление_с_остатком Wiki: Деление с остатком]</ref> и '''взятия модуля (modulus after devision)'''. В первом случае мы приводим число к диапазону [0 |b|].
  
 
Так какие функции и операторы реализуют остаток от деления, какие взятие по модулю, и как они зависят от типов аргументов? Ниже представлены результаты, полученные на Oryx 161, компилятор из Xilinx SDK 2014.4 ( gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-23)).
 
Так какие функции и операторы реализуют остаток от деления, какие взятие по модулю, и как они зависят от типов аргументов? Ниже представлены результаты, полученные на Oryx 161, компилятор из Xilinx SDK 2014.4 ( gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-23)).

Версия 12:33, 12 ноября 2015

Содержание

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

Лично я привык к работе функции mod(a, b) в MATLAB, которая приводит a к диапазону [0 b] или [b 0] (в зависимости от знака b) путем прибавления/вычитания целого числа b к/из a. Что выражается в формуле:

mod(a, b) = a - floor(a ./ b)*b,

где функция floor - округление в сторону минус бесконечности.

Как оказалось, следует отличать понятия остатка от деления (remainder after devision)[1] и взятия модуля (modulus after devision). В первом случае мы приводим число к диапазону [0 |b|].

Так какие функции и операторы реализуют остаток от деления, какие взятие по модулю, и как они зависят от типов аргументов? Ниже представлены результаты, полученные на Oryx 161, компилятор из Xilinx SDK 2014.4 ( gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-23)).

Классический %


Следует обратить внимание:

  • int a % uint b = mod(*(uint*(&a)), b) - результаты для -13%(int 7) и -13%(uint 7) различаются; если брать int % uint, то int интерпретируется как uint, например, -1 превращается в 2^32-1.
  • uint a % int b = b<0 ? a : mod(a, b) - взятие uint % отрицательного числа - холостая операция, результат - исходный uint
  • int a % int b = sign(a) * mod(|a|, |b|) - знак базы игнорируется, что противоречит интуитивному пониманию и mod в MATLAB
  • int a % int b = (MATLAB)rem(a, b) - ведет себя как функция rem() в MATLAB: rem(a, b) = a - fix(a/b)*b, где fix() - функция округления в сторону нуля
  • int a % int b ведет себя как функция mod() в MATLAB только при совпадении знаков аргументов, иначе есть смещение на b (за исключением точек, в которых результат ноль)

Выводы:

  • Остаток от деления и операция взятия по модулю не совпадают при аргументах с разными знаками
  • Оператор % дает остаток от деления

Для наглядности построены графики (доступен fig):


fmod

remainder

Ссылки

  1. Wiki: Деление с остатком

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.

Персональные инструменты
Пространства имён

Варианты
Действия
SRNS Wiki
Рабочие журналы
Приватный файлсервер
QNAP Сервер
Инструменты