Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.07;
Скачать: CL | DM;

Вниз

Целочисленное деление с округлением   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.015 c
3-20388
td
2003-07-15 23:24
2003.08.07
Lookup


14-20725
Димыч
2003-07-16 23:34
2003.08.07
Объектно-ориентированная технология


14-20778
AFrolov
2003-07-21 11:43
2003.08.07
Поможите советом (Обязанности свидетеля на свадьбе)


1-20498
Hatawa
2003-07-23 08:33
2003.08.07
Почему при передаче управления из MDI-окна лезут глюки?


14-20741
vidiv
2003-07-20 10:46
2003.08.07
На какие браузеры надо ориентироваться.