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

Материал из SRNS
Перейти к: навигация, поиск
(Классический %)
(Классический %)
Строка 58: Строка 58:
 
* '''uint a % int b = b<0 ? a : mod(a, b)'''  - взятие uint % отрицательного числа - холостая операция, результат - исходный uint
 
* '''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 = sign(a) * mod(|a|, |b|)''' - знак базы игнорируется, что противоречит интуитивному пониманию и mod в MATLAB
* int a % int b ведет себя как функция mod в MATLAB только при совпадении знаков аргументов, иначе есть смещение на b (за исключением точек, в которых результат ноль).  
+
* int a % int b ведет себя как функция mod() в MATLAB только при совпадении знаков аргументов, иначе есть смещение на b (за исключением точек, в которых результат ноль).  
  
 
Для наглядности построены графики (доступен fig):
 
Для наглядности построены графики (доступен fig):
{{Hider|title = Оператор %  
+
{{Hider|title = Оператор %, MATLAB mod()
 
  |content =  
 
  |content =  
 
<center>[[file:20151111_OperatorPerc.png]]</center>
 
<center>[[file:20151111_OperatorPerc.png]]</center>

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

Содержание

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

Ниже представлены результаты, полученные на 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 ведет себя как функция mod() в MATLAB только при совпадении знаков аргументов, иначе есть смещение на b (за исключением точек, в которых результат ноль).

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


]

fmod

remainder

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

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

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

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

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