|
|
| Посл.отвђт | Сообщен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 |