2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Функция модуля
Сообщение21.03.2009, 15:46 
Здравствуйте.
Никак немогу придумать формулу.
Мне нужно формулу
a mod b
(Тоесть другими словами получить остаток от деления)
Выразить через другие функции
Цитата:
+ - / * [] {}

Например можно так
a-([a/b]*b)
Но эта формула не работает если например a отрицательное число (в некоторых случаях ).

Это можно проверить через
Код:
program Project12;
{$APPTYPE CONSOLE}
uses
  SysUtils;
  function Modul(x, b: Integer): Integer;
  begin
    Result:= (x-(Trunc((x/b))*b));
  end;
var
  a: Integer;
begin
  Writeln(Modul(-438, 17));
  Readln(a);
end.

Или в Maple чётко видно
Изображение
Должно получаться 4, а при использовании этой формулы выходит -13
Подскажите пожалуйста, в чём-же тут дело?

 
 
 
 
Сообщение21.03.2009, 16:10 
Аватара пользователя
А это не одно и то же?
$-438 \mod 17=4\mod 17=-13 \mod 17$
$4-17=-13$
Смотря какой Вам остаток нужен.

Добавлено спустя 1 минуту 58 секунд:

А что это за функция {} такая? :roll:

 
 
 
 
Сообщение21.03.2009, 16:29 
Цитата:
Смотря какой Вам остаток нужен.

Я точно незнаю. Но в данном случае например мне нужно получить число 4 вместо -13 (тоесть как в Maple например)
А самое это число я буду использовать для алгоритма решения сравнения по модулю с одним неизвестным.
Тоесть изза того что моя формула даёт в результате -13 у меня получается неправильный ответ.

Цитата:
А что это за функция {} такая?

Дробная часть числа.

 
 
 
 
Сообщение21.03.2009, 16:41 
nbyte в сообщении #197194 писал(а):
Должно получаться 4, а при использовании этой формулы выходит -13
Подскажите пожалуйста, в чём-же тут дело?

Функция Trunc округляет к нулю симметрично, а для получения остатка нужно одностороннее округление. Запрограммируйте вручную обработку отдельно положительных и отдельно отрицательных входных данных.

------------------------------------------------------
И, кстати, эта функция здесь выглядит некультурно. Лучше использовать n mod k (там тоже возникают аналогичные проблемы со знаками, и их тоже придётся обходить добавлением условного оператора).

 
 
 
 
Сообщение21.03.2009, 17:19 
Цитата:
а для получения остатка нужно одностороннее округление.

А вот как :)
ewert, спасибо вам за помощь.

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group