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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2015, 23:33   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Аватар, запустил вот так:
Исправил
Код:
function iDivMod(const X: DWORD; const Y: Byte; out Z: Byte): DWORD;
var r: Int64;
    p: ^Word;
    i: Integer;
begin
  r:=X;
  p:=Addr(r);
  Inc(p,2);
  Result:=0;
  for i:=1 to 32 do begin
    r:=r shl 1;
    Result:=Result shl 1;
    if p^>=Y then begin
      Result:=Result or 1;
      p^:=p^-Y;
    end;
  end;
  z:=p^;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.06.2015, 23:35   #12
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Код:
function iDivMod(const X: DWORD; const Y: DWord; var Z: DWord): DWORD;
var
	a, b, k : DWord;
begin

	a := 0;
	b := x+1;
	
	while b-a > 1 do begin
		k := (a+b) div 2;
		if k*y > x then 
			b := k
		else
			a := k
	end;

	iDivMod := a;
	z := x-a*y
  // Result <--- целая часть результата деления X на Y
  // Z  <--- остаток от деления X на Y
end;
Тестировал, не?
"div 2" юзать нельзя по условию задачи.
замени на "shr 1".
Цитата:
Код:
if k*y > x then
а если произведение вылезет за 32 бита?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 11.06.2015, 23:37   #13
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Проморгал, данке
Цитата:
Тестировал, не?
Было дело.. тыц
Poma][a вне форума Ответить с цитированием
Старый 11.06.2015, 23:45   #14
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
DWORD iDivMod(const DWORD X, const UCHAR Y, UCHAR & Z) {
  // return <--- целая часть результата деления X на Y
  // *Z  <--- остаток от деления X на Y

    DWORD mumu[4] = {X, Y, 0, 0};

    for (;mumu[0];mumu[0]>>=1) mumu[2]++;
    for (;mumu[1];mumu[1]>>=1) mumu[2]--;

    mumu[0] = X;
    mumu[1] = Y;
    mumu[1] <<= mumu[2];

    for (;mumu[2];mumu[2]--, mumu[1]>>=1) {
        if (mumu[0] >= mumu[1]) {
            mumu[0] -= mumu[1];
            mumu[3] |= (1<<mumu[2]);
        }

    }

    Z = mumu[0];
    return mumu[3];
}
как-то так

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

Пасибо всем участникам. Написал я демо и потестил ваши алгоритмы. Результаты, прямо скажем, неоднозначные (особенно на границах диапазона)
Думаю, скриншот скажет больше 1000 слов.



И ещё по каждому из ваших алгоритмов у меня один и тот же вопрос: "как я буду объяснять всё это бабульке?". Бабулька должна перевести один из алгоритмов на ассемблер от дико урезанного контроллера (нету там логики и команд деления).
Короче, надо комменты и/или БСА.

Значения > 0x7FFFFFFF не подставлял пока, но требуется работа именно с беззнаковыми 4-байтными целыми. Надо будет допилить.

Приму в дар ещё варианты решения в неограниченном количестве, желательно, отлаженные для всех значений в диапазоне 0..0xFFFFFFFF. Хочу сделать бенчмарк по скорости работы.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 12.06.2015, 05:01   #16
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

сорри, исходник + ехе забыл прицепить. поиграйтесь.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 12.06.2015, 07:02   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Бабулька должна перевести один из алгоритмов на ассемблер от дико урезанного контроллера (нету там логики и команд деления).
У меня двоичное деление в столбик и только для интеловского порядка байтов - от младшего к старшему

ps - умозрительная приспособа для обратного порядка -> заменить Inc(p,2) на Inc(p,1)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

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

Код:
DWORD iDivMod(const DWORD X, const UCHAR Y, UCHAR & Z) {
  // return <--- целая часть результата деления X на Y
  // *Z  <--- остаток от деления X на Y

    DWORD mumu[4] = {X, Y, 0, 0};

    for (;mumu[0];mumu[0]>>=1) mumu[2]++;
    for (;mumu[1];mumu[1]>>=1) mumu[2]--;

    mumu[0] = X;
    mumu[1] = Y;
    mumu[1] <<= mumu[2];

    for (;mumu[1]>=Y;) {
        mumu[3] <<= 1;

        if (mumu[0] >= mumu[1]) {
            mumu[0] -= mumu[1];
            mumu[3] |= 1;
        }

        mumu[1] >>= 1;
    }

    Z = mumu[0];
    return mumu[3];
}
а если так?

Цитата:
"как я буду объяснять всё это бабульке?"
деление в столбик как и у Аватар. он воспользовался сдвигом в 3й WORD Int64. я выровнял делитель внутри DWORD.

Последний раз редактировалось f.hump; 12.06.2015 в 11:45.
f.hump вне форума Ответить с цитированием
Старый 12.06.2015, 11:57   #19
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Как все коварно..
Код:
function iDivMod(const X: DWORD; const Y: DWord; var Z: DWord): DWORD;
var
	a, b, k : DWord;
begin

	a := 0;
	b := x+1;
	
	while b-a > 1 do begin
		k := (a+b) div 2;
		if Real(k)*Real(y) > Real(x) then 
			b := k
		else
			a := k
	end;

	iDivMod := a;
	z := x-a*y
  // Result <--- целая часть результата деления X на Y
  // Z  <--- остаток от деления X на Y
end;
Давайте тогда так сравнивать
Poma][a вне форума Ответить с цитированием
Старый 12.06.2015, 12:12   #20
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

мои пять копеек
Код:
function divbyte(x: word; y: byte; out z: byte): word;
var
  d: byte;
begin
  d:=0;
  while (y shl d)<x do Inc(d);

  result:=0;
  while d>0 do begin
    if x>(y shl d) then begin 
      x:=x-(y shl d); 
      Inc(result);
    end;
    result:=result shl 1;
    dec(d);
  end;
  z:=x;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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