· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Умножение P4 imul или add

Посл.отвђт Сообщенiе


Дата: Июл 7, 2004 13:21:10

Есть формула для получения числа дней из даты: Год*365.25+Месяц*30.6+День с достаточной точностью можно преобразовать к виду y*1461/4+m*1959/64+d. Вопрос - как наиболее быстро посчитать это на P4?
Вариант в лоб:
mov edx,y
imul edx,1461
SHR edx, 2
mov eax,m
imul eax,1959
shr eax,6
add eax,edx
add eax,d


Вариант 2:
mov edx, m
lea eax, [edx+edx*4]
lea ecx, [eax+eax]
add ecx, ecx
add ecx, ecx
sub ecx, eax
lea eax, [ecx+ecx]
add eax, eax
add eax, eax
sub eax, ecx
add eax, eax
mov ecx, y
add eax, eax
add eax, eax
sub eax, edx
sar eax, 6
lea edx, [ecx+ecx]
add edx, edx
add edx, edx
add edx, edx
sub edx, ecx
lea edx, [ecx+edx*4]
add edx, edx
add edx, edx
add edx, edx
sub edx, ecx
lea ecx, [edx+edx]
add ecx, ecx
sub ecx, edx
sar ecx, 2
add eax, ecx
add eax, d

как нибудь можно оптимизировать или по другому записать второй вариант, или стоит остановиться на первом?


Дата: Июл 7, 2004 14:17:37

забыл привести к общему знаменателю:
(y*23376+m*1959)/64+d
Вариант1:
imul edx,y,23376
imul eax,m,1959
add eax,edx
sar eax,6
add eax,d

Вариант2:
mov edx, m
lea eax, [edx+edx*4]
lea ecx, [eax+eax]
add ecx, ecx
add ecx, ecx
sub ecx, eax
lea eax, [ecx+ecx]
add eax, eax
add eax, eax
sub eax, ecx
add eax, eax
add eax, eax
add eax, eax
sub eax, edx
imul edx, y, 23376
add eax, edx
sar eax, 6
add eax, d


Дата: Июл 7, 2004 21:03:57 · Поправил: coban2k

mov edx, m
lea eax, [edx+edx*4]
lea ecx, [eax+eax]
shl ecx, 2
sub ecx, eax
lea eax, [ecx+ecx]
shl eax, 2
sub eax, ecx
shl eax, 2
add eax, eax
sub eax, edx
imul edx, y, 23376
add eax, edx
sar eax, 6
add eax, d


Дата: Июл 7, 2004 23:45:42

r97
Что-то вторая константа выглядит подозрительно, даже для високосного года перед декабрём прошло всего 366-31=335 дней.
Что дает такую константу 335/11=30.46
А 30.6*11=336.6, то есть на полтора для больше получается.
У меня для цикла длиной в 4 года(вычисленая по МНК) получилось 30.39462553, при этом среднекрадратичное отклонение уменьшилось в два раза, и максимальная ошибка с 2.3 дней до 1.5 .


Дата: Июл 8, 2004 09:32:29

Black_mirror
Перед расчетом месяцы преобразуются:
if(m>2){
m++;
}
else {
m = m+13;
y--;
}
в итоге все получается так как надо


Дата: Июл 8, 2004 10:05:28

r97
формула для получения числа дней из даты
Что является результатом?


Дата: Июл 8, 2004 10:14:36

q_q
Число дней

Это часть алгоритма получения числа дней прошедших с какогото момента, т.е. разницы между двумя датами:
y2.m2.d2 - y1.m1.d1

if( m1>2 ){
m1++;
}
else
{
m1 = m1+13;
y1--;
}
if( m2>2 )
{
m2++;
}
else {
m2 = m2+13;
y2--;
}
return (((y2-y1)*23376+(m2-m1)*1959)>>6)+d2-d1;


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.261