Задачка о трёх векторах(оптимизация на размер)

Тема в разделе "WASM.A&O", создана пользователем Black_mirror, 19 окт 2009.

  1. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    То есть третья операция не нужна, если две первые уже показали направление. И её результат может быть произвольным.
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Booster
    А еще бывает что A^B<0. И еще B^C<0. А еще ведь и равно нулю что-то быть может. Случай когда два вектора направлены в противоположные стороны был специально оставлен, чтобы алгоритм получился посложнее, и был больший простор для оптимизации ;)
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Black_mirror
    Эти случаи просто нужно обрабатывать и всё. ^) Если A^B<0 значит пошли в обратку и если и B^C<0, то по часовой. Если же B^C>0, то проверяем A^C.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    угу, там дело техники. их не так уж и много. меньше 8 точно =) табличка из 1 байта ;)
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    точнее не более 8.
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    В общем нужно рассматривать произведения A^B, B^C и C^A(а не A^C), если два или три из них положительные, значит мы двигаемся против часовой стрелки, а если два или три отрицательне, значит по часовой. Причем если одно из произведений равно нулю, то его можно тоже считать положительным, потому что два других произведения в этом случае будут иметь одинаковый знак.
     
  7. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Black_mirror
    да, случай угла > 180 между А и С, я пропустил. тут или выход после верных 2ух первых проверок или щас подумаю. или завтра..
    случаи когда B^A и B^C одного знака, для угла < 180 между A и C обрабатываются нормально, вроде. щас уже сплю одним глазом.

    когда вектора лежат на одной прямой не обрабатываются только в случае, если все 3 на одной прямой, пусть и в противоположные. но в условиях (#8) написано, что результат в таких случаях неопределен
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Black_mirror
    Это по-моему вкусовые тонкости. Не так важно, будет ли оно сразу проверятся или позже, сразу так даже лучше, ибо если ++ или --, то не нужно считать третье.
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ещё я не понял, где здесь скалярное произведение.
     
  10. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Код (Text):
    1. call det;A^B
    2. sbb ax,ax;
    3. xchg ax,cx
    4. call det;C^B
    5. adc al,-1;аналог sbb al,0,  если бы вычислялось B^C
    6. xchg bx,cx
    7. call det;A^C
    8. adc al,-1+1;+1 чтобы результат был не от -3 до 0, а от -2 до +1
    9. shr al,7
    10.  
    11. det:
    12. pusha
    13. xchg al,bl
    14. imul ah
    15. xchg ax,bx
    16. imul ah
    17. sub ax,bx
    18. shl ax,1
    19. popa
    20. ret
    Booster
    Вот вариант похожий на вариант qqwe, а как это сделать с переходами за меньшее число байт? (в коде могут быть баги)

    А скалярное произведение можно считать если в векторном произведении первый вектор повернуть на 90 градусов :)
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Black_mirror
    Оптимизация по размеру, с выигрышем нескольких байт, в ущерб скорости? Мне давно такая оптимизация не интересна. Жуков бояться, в лес не ходить.
     
  12. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Booster
    Тогда меняем условие задачи, все три вектора лежат в mm0 в виде 0000CYCXBYBXAYAX. В результате нужно заполнить все разряды mm0 нулями или единицами. Такая оптимизация интересна?)
     
  13. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Black_mirror
    а зачем надо popa|pusha? и adc|sbb? чтобы проверить, что '-' больше 1, надо просто завести накопитель и складывать предыдущий det с новым в расчете det. если переход, то 0, а параметры передавать через стек. например так:

    Код (Text):
    1. mov di,sp
    2.  
    3. push ax
    4. push bx
    5. push cx
    6. push ax
    7.  
    8. mov cx,3
    9. xor dx,dx
    10.  
    11. det:
    12.   pop bx
    13.   pop ax
    14.   push ax
    15.   ;--
    16.   xchg al,bl
    17.   imul ah
    18.   xchg ax,bx
    19.   imul ah
    20.   sub ax,bx
    21.   ;--
    22.   xadd ax,dx
    23.   jс short yes_no
    24.   ;--
    25.   loop det
    26.  
    27. yes_no:
    28.   mov sp,di
    29.    ; в принципе все следующие команды можно заменить на setc al
    30.   mov ax,cx
    31.   sub al,1
    32.   rcr ax,16