Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2015, 14:00   #21
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
а если так?
а вроде всё ОК пока. Переводил на паскаль тупо в лоб, не думая.
Код:
function iDivMod_v3(const X: DWORD; const Y: Byte; out Z: Byte): DWORD;
var
  mumu: array[0..3] of DWORD;
begin
  mumu[0]:= X;
  mumu[1]:= Y;
  mumu[2]:= 0;
  mumu[3]:= 0;

  while mumu[0] <> 0 do
    begin
      Inc(mumu[2]);
      mumu[0]:= mumu[0] shr 1;
    end;

  while mumu[1] <> 0 do
    begin
      Dec(mumu[2]);
      mumu[1]:= mumu[1] shr 1;
    end;

  mumu[0]:= X;
  mumu[1]:= Y shl mumu[2];


   while mumu[1] >= Y do
    begin
      mumu[3]:= mumu[3] shl 1;

      if mumu[0] >= mumu[1]
        then begin
               mumu[0]:= mumu[0] - mumu[1];
               mumu[3]:= mumu[3] or 1;
             end;

      mumu[1]:= mumu[1] shr 1;
    end;

  Z:= Byte(mumu[0]);
  Result:= mumu[3];
end;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 12.06.2015, 18:06   #22
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
мои пять копеек
Взял на проверку. Не думая, допилил под нужный тип данных.
Код:
// evg_m
function iDivMod_v4(const X: DWORD; const Y: Byte; out Z: Byte): DWORD;
var
  d: byte;
  vX: DWord;
begin
  d:= 0;
  vX:= X;

  while (Y shl d) < vX do
    Inc(d);

  Result:= 0;

  while d <> 0 do
    begin
      if vX > (Y shl d) // может выехать за старший бит?
        then begin
               vX:= vX - (Y shl d);
               Inc(Result);
             end;

      Result:= Result shl 1;
      Dec(d);
    end;

  z:= vX;
end;
Выглядит аппетитно, но работает криво. Может, допинаешь до 100%-ного результата?



Прога с исходниками и прочим мусором - тут.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 12.06.2015 в 18:10.
min@y™ вне форума Ответить с цитированием
Старый 12.06.2015, 18:25   #23
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
Может, допинаешь до 100%-ного результата?
и сам бы уже мог. сдвиг результата перенеси вперед проверки условия, и >=, вместо >. тоже деление в столбик.

Последний раз редактировалось f.hump; 12.06.2015 в 18:31.
f.hump вне форума Ответить с цитированием
Старый 12.06.2015, 19:48   #24
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
и сам бы уже мог.
попробовал.
не прокатило. отлаживать чужой некомментированный код с одно-двухбуквенными переменными - тот ещё триппер, сам знаешь.
Код:
function iDivMod_v4(const X: DWORD; const Y: Byte; out Z: Byte): DWORD;
var
  d: byte;
  vX: DWord;
begin
  d:= 0;
  vX:= X;

  while (Y shl d) < vX do
    Inc(d);

  Result:= 0;

  while d <> 0 do
    begin
      Result:= Result shl 1; // сдвиг результата перенеси вперед проверки условия
      
      if vX >= (Y shl d) // и >=, вместо > (может выехать за старший бит?)
        then begin
               vX:= vX - (Y shl d);
               Inc(Result);
             end;

      //Result:= Result shl 1;
      Dec(d);
    end;

  z:= vX;
end;

Целая часть результата отличается от правильного 2 раза (сдвинута на бит вправо), а остаток лежит в диапазоне 0...2Y-1 вместо 0...Y-1.
Я б, конечно, мог понавешать костылей, но отчаянно хочу врубиться, чо происходит с переменными и зачем.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 14.06.2015, 23:52   #25
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Сделал простейший бенчмарк. Самым быстрым оказался вариант от f.hump, но он имеет один маленький недостаток - работает неправильно. f.hump, мож допилишь?

Вложения
Тип файла: rar Замена iDIV на iMUL.rar (145.9 Кб, 4 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 15.06.2015, 10:06   #26
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Выглядит аппетитно, но работает криво. Может, допинаешь до 100%-ного результата?
Исправленная версия
Код:
function iDivMod_v4(const X: DWORD; const Y: Byte; out Z: Byte): DWORD;
var
  d: byte;
  vX: DWord;
begin
  d:= 0;
  vX:= X;

  if y=0 then Abort; //деление на ноль ?
  while ((Y shl d) <= vX)
    and ((Y shl d) <=$7FFFFFFF) //НЕ выходить выход за старший бит
  do Inc(d);
  if vX>=$80000000 then Inc(d); //добавить обработку старшего бита X

  Result:= 0;

  while d >0 do
    begin
      Dec(d);
      Result:= Result shl 1;
      if vX >= (Y shl d) // может выехать за старший бит?
        then begin
               vX:= vX - (Y shl d);
               Inc(Result);
             end;
    end;

  z:= vX;
end;
P.S. возможно имеет смысл еще в одной переменной
Код:
ry:=y shl d;
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 15.06.2015, 16:58   #27
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Исправленная версия
Принял.
Проверил.
Ок.
Вложения
Тип файла: rar Замена iDIV на iMUL.rar (154.5 Кб, 7 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 15.06.2015, 18:33   #28
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
f.hump, мож допилишь?
как-то лень, да и ошибок я не вижу.

зы: если зависает при попытке деления на 0, то это не ошибка, а фича.

Последний раз редактировалось f.hump; 15.06.2015 в 18:42.
f.hump вне форума Ответить с цитированием
Старый 15.06.2015, 19:55   #29
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
как-то лень, да и ошибок я не вижу.
а не надо. пытаюсь переписать на асме.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
Выдать возраст по русски "Вам ___ лет" (Задача в Паскале другим способом) dimanaprimer Помощь студентам 2 08.10.2012 10:13
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Ваше "топливо" для мозга Ivan_32 Свободное общение 60 07.06.2009 21:08
Слабо "Морской бой" на ассемблере? =) VenZell Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 26.05.2009 21:36