Форум: "Основная";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];
ВнизЦелочисленное деление с округлением Найти похожие ветки
← →
Verg (2003-07-23 13:21) [0]Что-то не могу сообразить:
function divr(a, b : integer):integer;
begin
result:= a div b;
if ((a-result*b) shl 1) >= b then inc(result);
end;
Так получается, что операция деления сопровождается лишней операцией умножения.
Есть более красивые, быстрые варианты?
Обиднее всего, что остаток от деления становится известен еще при делении, т.е. a-result*b повторно вычислять по большому счету не надо бы, но как его "взять" после a div b?
← →
Sandman25 (2003-07-23 13:22) [1]Возможно,
(a + b shr 1) div b
← →
Verg (2003-07-23 13:28) [2]
> Sandman25 ©
Да, может быть.... Чет-то туплю сегодня :)
точно ... trunc(a) = round(a-0.5)
← →
Sandman25 (2003-07-23 13:31) [3]round(a/b)=trunc(a/b+0.5)=trunc((a+0.5b)/b)
← →
Verg (2003-07-23 13:32) [4]Правда существует еще одно условие:
если остаток от деления точно равен 0.5, то округлять в строну большего надо только нечетный результат деления...
← →
Verg (2003-07-23 13:33) [5]Спасибо, Sandman25 ©
← →
MBo (2003-07-23 14:09) [6]function divr(a, b : dword):dword;
asm
mov ecx,edx
xor edx,edx
div ecx
shl edx,1
cmp edx,ecx
jb @@Exit
inc eax
@@Exit:
end;
0.5 округляется вверх
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c