Вычисление синуса
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [18.97.9.174] |
|
|
правила раздела Алгоритмы

Вычисление синуса
|
Сообщ.
#1
,
|
|
|
|
Собственно требуется быстрое вычисление sin(x) с точностью до двух знаков. Разложение в ряд Тейлора по степеням и вычисление через цепные дроби тангенса не подходит... (довольно медленно). x в радианах.
|
|
Сообщ.
#2
,
|
|
|
|
табличкой воспльзоваться
зы так чтобы понятно было... значит так. ![]() ![]() <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> ------------------------------------------------ ![]() ![]() <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 |