На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Вычисление синуса
    Собственно требуется быстрое вычисление sin(x) с точностью до двух знаков. Разложение в ряд Тейлора по степеням и вычисление через цепные дроби тангенса не подходит... (довольно медленно). x в радианах.
      табличкой воспльзоваться
      зы
      так чтобы понятно было... значит так.
      ExpandedWrap disabled
        <br>TITLE  Sine of an Angle (EX59.ASM)<br>          PAGE      ,132<br>DATA        SEGMENT   PARA 'DATA'<br>SINES  DW  0,175,349,523,698,872     ;0-5<br>       DW  1045,1219,1392,1564,1736  ;6-10<br>       DW  1908,2079,2250,2419,2588  ;11-15<br>       DW  2756,2924,3090,3256,3420  ;16-20<br>       DW  3584,3746,3907,4067,4226  ;21-25<br>       DW  4384,4540,4695,4848,5000  ;26-30<br>       DW  5150,5299,5446,5592,5736  ;31-35<br>       DW  5878,6018,6157,6293,6428  ;36-40<br>       DW  6561,6691,6820,6947,7071  ;41-45<br>       DW  7193,7313,7431,7547,7660  ;46-50<br>       DW  7771,7880,7986,8090,8191  ;51-55<br>       DW  8290,8387,8480,8572,8660  ;56-60<br>       DW  8746,8829,8910,8988,9063  ;61-65<br>       DW  9135,9205,9272,9336,9397  ;66-70<br>       DW  9455,9511,9563,9613,9659  ;71-75<br>       DW  9703,9744,9781,9816,9848  ;76-80<br>       DW  9877,9903,9926,9945,9962  ;81-85<br>       DW  9976,9986,9994,9998,10000 ;86-90<br>DATA      ENDS<br>OUR_CODE  SEGMENT   PARA 'CODE'<br>        PUBLIC    FIND_SINE<br>FIND_SINE PROC      FAR<br>          ASSUME    CS:OUR_CODE,DS:DATA<br>        PUSH          DS                   ;Save the caller's registers<br>        PUSH      AX<br>        PUSH      CX<br>;<br>;  Initialize the data segment address.<br>;<br>        MOV          BX,DATA<br>        MOV       DS,BX<br>;<br>;  This is the look-up procedure.<br>;<br>        SUB          CX,CX           ;Initialize sign to 0<br>        CMP          AX,181           ;Angle < 181 degrees?<br>        JB          SIN_POS           ; Yes.  Continue with sign = 0<br>        MOV          CX,8000H           ; No.  Set sign = 1<br>        SUB          AX,180           ;  and subtract 180 from angle<br>SIN_POS:  CMP          AX,91           ;Angle < 91 degrees?<br>        JB          GET_SIN           ; Yes.  Go look up sine<br>        NEG          AX                   ; No.  Subtract angle from 180<br>        ADD          AX,180<br>GET_SIN:  MOV          BX,AX           ;Make angle a word index<br>        SHL       BX,1<br>        MOV          BX,SINES[BX]     ; and look up the sine value<br>        OR          BX,CX           ;Combine sine with sign bit<br>        POP          CX<br>        POP          AX<br>        POP          DS<br>        RET                       ; and exit<br>FIND_SINE ENDP<br>OUR_CODE  ENDS<br>          END   FIND_SINE<br><br>

      ------------------------------------------------
      ExpandedWrap disabled
        <br> SP>> Hаpод, помогите плз, как сделать ф-цию Cинyс на асме???<br> AK> 1. Мат. Сопpоцессоp. 387 ><br> AK> 2. Составить вою таблицу значений и использовать ее<br><br>=== Cut ===<br><br><br>  Here's some  explanation about the  sinus table generator in the<br>  ACE BBS advert.<br>  The method used is a recursive sinus sythesis.  It's possible to<br>  compute all sinus values with only the two previous ones and the<br>  value  of  cos(2у/N) , where  n  is the number of values for one<br>  period.<br><br>  It's as follow:<br><br>  Sin(K)=2.Cos(2у/N).Sin(K-1)-Sin(K-2)<br><br>  or<br><br>  Cos(K)=2.Cos(2у/N).Cos(K-1)-Cos(K-2)<br><br>  The last one is easiest to use , because the two first values of<br>  the cos table are 1 & cos(2у/n) and with this two values you are<br>  able to build all the following...<br><br>  Some simple code:<br><br>  the cos table has 1024 values & ranges from -2^24 to 2^24<br><br><br>  build_table:          lea    DI,cos_table<br>                        mov    CX,1022<br>                        mov    EBX,cos_table[4]<br>                        mov    EAX,EBX<br>  @@calc:<br>                        imul   EBX<br>                        shrd   EAX,EDX,23<br>                        sub    EAX,[DI-8]<br>                        stosd<br>                        loop   @@calc<br><br><br>  cos_table             dd     16777216     ; 2^24<br>                        dd     16776900     ; 2 ^24*cos(2у/1024)<br>                        dd     1022 dup (?)<br><br><br><br><br>                               Enjoy  KarL/NoooN<br><br>=== Cut ===<br><br>С бестовыми регардами , Kostya Volkov aka Reminder // [WW] [DVC]<br><br>---<br> * Origin: chaos a.d. (2:4631/17)<br><br><br>


      туточки дополнительная инфа
      http://www.enlight.ru/demo/faq/smth.phtml?query=alg_trig
      Сообщение отредактировано: iz -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0.0729 ]   [ 15 queries used ]   [ Generated: 6.10.26, 00:28 GMT ]