66
77#include "twin_private.h"
88
9- #define TWIN_LOG2_SIN 10
10-
11- /*
12- * construction:
13- int s = 10; for (int i = 0; i < (1 << s); i++) {
14- if (i % 8 == 0) printf ("\n ");
15- printf (" 0x%04x,", floor (sin(pi/2 * i / (1 << s)) * 2**16 + 0.5));
16- }
17- */
18-
19- static const uint16_t _twin_sin_table [1 << TWIN_LOG2_SIN ] = {
20- 0x0000 , 0x0065 , 0x00c9 , 0x012e , 0x0192 , 0x01f7 , 0x025b , 0x02c0 , 0x0324 ,
21- 0x0389 , 0x03ed , 0x0452 , 0x04b6 , 0x051b , 0x057f , 0x05e4 , 0x0648 , 0x06ad ,
22- 0x0711 , 0x0776 , 0x07da , 0x083f , 0x08a3 , 0x0908 , 0x096c , 0x09d1 , 0x0a35 ,
23- 0x0a9a , 0x0afe , 0x0b62 , 0x0bc7 , 0x0c2b , 0x0c90 , 0x0cf4 , 0x0d59 , 0x0dbd ,
24- 0x0e21 , 0x0e86 , 0x0eea , 0x0f4e , 0x0fb3 , 0x1017 , 0x107b , 0x10e0 , 0x1144 ,
25- 0x11a8 , 0x120d , 0x1271 , 0x12d5 , 0x1339 , 0x139e , 0x1402 , 0x1466 , 0x14ca ,
26- 0x152e , 0x1593 , 0x15f7 , 0x165b , 0x16bf , 0x1723 , 0x1787 , 0x17eb , 0x1850 ,
27- 0x18b4 , 0x1918 , 0x197c , 0x19e0 , 0x1a44 , 0x1aa8 , 0x1b0c , 0x1b70 , 0x1bd4 ,
28- 0x1c38 , 0x1c9b , 0x1cff , 0x1d63 , 0x1dc7 , 0x1e2b , 0x1e8f , 0x1ef3 , 0x1f56 ,
29- 0x1fba , 0x201e , 0x2082 , 0x20e5 , 0x2149 , 0x21ad , 0x2210 , 0x2274 , 0x22d7 ,
30- 0x233b , 0x239f , 0x2402 , 0x2466 , 0x24c9 , 0x252d , 0x2590 , 0x25f4 , 0x2657 ,
31- 0x26ba , 0x271e , 0x2781 , 0x27e4 , 0x2848 , 0x28ab , 0x290e , 0x2971 , 0x29d5 ,
32- 0x2a38 , 0x2a9b , 0x2afe , 0x2b61 , 0x2bc4 , 0x2c27 , 0x2c8a , 0x2ced , 0x2d50 ,
33- 0x2db3 , 0x2e16 , 0x2e79 , 0x2edc , 0x2f3f , 0x2fa1 , 0x3004 , 0x3067 , 0x30ca ,
34- 0x312c , 0x318f , 0x31f1 , 0x3254 , 0x32b7 , 0x3319 , 0x337c , 0x33de , 0x3440 ,
35- 0x34a3 , 0x3505 , 0x3568 , 0x35ca , 0x362c , 0x368e , 0x36f1 , 0x3753 , 0x37b5 ,
36- 0x3817 , 0x3879 , 0x38db , 0x393d , 0x399f , 0x3a01 , 0x3a63 , 0x3ac5 , 0x3b27 ,
37- 0x3b88 , 0x3bea , 0x3c4c , 0x3cae , 0x3d0f , 0x3d71 , 0x3dd2 , 0x3e34 , 0x3e95 ,
38- 0x3ef7 , 0x3f58 , 0x3fba , 0x401b , 0x407c , 0x40de , 0x413f , 0x41a0 , 0x4201 ,
39- 0x4262 , 0x42c3 , 0x4324 , 0x4385 , 0x43e6 , 0x4447 , 0x44a8 , 0x4509 , 0x456a ,
40- 0x45cb , 0x462b , 0x468c , 0x46ec , 0x474d , 0x47ae , 0x480e , 0x486f , 0x48cf ,
41- 0x492f , 0x4990 , 0x49f0 , 0x4a50 , 0x4ab0 , 0x4b10 , 0x4b71 , 0x4bd1 , 0x4c31 ,
42- 0x4c90 , 0x4cf0 , 0x4d50 , 0x4db0 , 0x4e10 , 0x4e70 , 0x4ecf , 0x4f2f , 0x4f8e ,
43- 0x4fee , 0x504d , 0x50ad , 0x510c , 0x516c , 0x51cb , 0x522a , 0x5289 , 0x52e8 ,
44- 0x5348 , 0x53a7 , 0x5406 , 0x5464 , 0x54c3 , 0x5522 , 0x5581 , 0x55e0 , 0x563e ,
45- 0x569d , 0x56fc , 0x575a , 0x57b9 , 0x5817 , 0x5875 , 0x58d4 , 0x5932 , 0x5990 ,
46- 0x59ee , 0x5a4c , 0x5aaa , 0x5b08 , 0x5b66 , 0x5bc4 , 0x5c22 , 0x5c80 , 0x5cde ,
47- 0x5d3b , 0x5d99 , 0x5df6 , 0x5e54 , 0x5eb1 , 0x5f0f , 0x5f6c , 0x5fc9 , 0x6026 ,
48- 0x6084 , 0x60e1 , 0x613e , 0x619b , 0x61f8 , 0x6254 , 0x62b1 , 0x630e , 0x636b ,
49- 0x63c7 , 0x6424 , 0x6480 , 0x64dd , 0x6539 , 0x6595 , 0x65f2 , 0x664e , 0x66aa ,
50- 0x6706 , 0x6762 , 0x67be , 0x681a , 0x6876 , 0x68d1 , 0x692d , 0x6989 , 0x69e4 ,
51- 0x6a40 , 0x6a9b , 0x6af6 , 0x6b52 , 0x6bad , 0x6c08 , 0x6c63 , 0x6cbe , 0x6d19 ,
52- 0x6d74 , 0x6dcf , 0x6e2a , 0x6e85 , 0x6edf , 0x6f3a , 0x6f94 , 0x6fef , 0x7049 ,
53- 0x70a3 , 0x70fe , 0x7158 , 0x71b2 , 0x720c , 0x7266 , 0x72c0 , 0x731a , 0x7373 ,
54- 0x73cd , 0x7427 , 0x7480 , 0x74da , 0x7533 , 0x758d , 0x75e6 , 0x763f , 0x7698 ,
55- 0x76f1 , 0x774a , 0x77a3 , 0x77fc , 0x7855 , 0x78ad , 0x7906 , 0x795f , 0x79b7 ,
56- 0x7a10 , 0x7a68 , 0x7ac0 , 0x7b18 , 0x7b70 , 0x7bc8 , 0x7c20 , 0x7c78 , 0x7cd0 ,
57- 0x7d28 , 0x7d7f , 0x7dd7 , 0x7e2f , 0x7e86 , 0x7edd , 0x7f35 , 0x7f8c , 0x7fe3 ,
58- 0x803a , 0x8091 , 0x80e8 , 0x813f , 0x8195 , 0x81ec , 0x8243 , 0x8299 , 0x82f0 ,
59- 0x8346 , 0x839c , 0x83f2 , 0x8449 , 0x849f , 0x84f5 , 0x854a , 0x85a0 , 0x85f6 ,
60- 0x864c , 0x86a1 , 0x86f7 , 0x874c , 0x87a1 , 0x87f6 , 0x884c , 0x88a1 , 0x88f6 ,
61- 0x894a , 0x899f , 0x89f4 , 0x8a49 , 0x8a9d , 0x8af2 , 0x8b46 , 0x8b9a , 0x8bef ,
62- 0x8c43 , 0x8c97 , 0x8ceb , 0x8d3f , 0x8d93 , 0x8de6 , 0x8e3a , 0x8e8d , 0x8ee1 ,
63- 0x8f34 , 0x8f88 , 0x8fdb , 0x902e , 0x9081 , 0x90d4 , 0x9127 , 0x9179 , 0x91cc ,
64- 0x921f , 0x9271 , 0x92c4 , 0x9316 , 0x9368 , 0x93ba , 0x940c , 0x945e , 0x94b0 ,
65- 0x9502 , 0x9554 , 0x95a5 , 0x95f7 , 0x9648 , 0x969a , 0x96eb , 0x973c , 0x978d ,
66- 0x97de , 0x982f , 0x9880 , 0x98d0 , 0x9921 , 0x9972 , 0x99c2 , 0x9a12 , 0x9a63 ,
67- 0x9ab3 , 0x9b03 , 0x9b53 , 0x9ba3 , 0x9bf2 , 0x9c42 , 0x9c92 , 0x9ce1 , 0x9d31 ,
68- 0x9d80 , 0x9dcf , 0x9e1e , 0x9e6d , 0x9ebc , 0x9f0b , 0x9f5a , 0x9fa8 , 0x9ff7 ,
69- 0xa045 , 0xa094 , 0xa0e2 , 0xa130 , 0xa17e , 0xa1cc , 0xa21a , 0xa268 , 0xa2b5 ,
70- 0xa303 , 0xa350 , 0xa39e , 0xa3eb , 0xa438 , 0xa485 , 0xa4d2 , 0xa51f , 0xa56c ,
71- 0xa5b8 , 0xa605 , 0xa652 , 0xa69e , 0xa6ea , 0xa736 , 0xa782 , 0xa7ce , 0xa81a ,
72- 0xa866 , 0xa8b2 , 0xa8fd , 0xa949 , 0xa994 , 0xa9df , 0xaa2a , 0xaa76 , 0xaac1 ,
73- 0xab0b , 0xab56 , 0xaba1 , 0xabeb , 0xac36 , 0xac80 , 0xacca , 0xad14 , 0xad5e ,
74- 0xada8 , 0xadf2 , 0xae3c , 0xae85 , 0xaecf , 0xaf18 , 0xaf62 , 0xafab , 0xaff4 ,
75- 0xb03d , 0xb086 , 0xb0ce , 0xb117 , 0xb160 , 0xb1a8 , 0xb1f0 , 0xb239 , 0xb281 ,
76- 0xb2c9 , 0xb311 , 0xb358 , 0xb3a0 , 0xb3e8 , 0xb42f , 0xb477 , 0xb4be , 0xb505 ,
77- 0xb54c , 0xb593 , 0xb5da , 0xb620 , 0xb667 , 0xb6ad , 0xb6f4 , 0xb73a , 0xb780 ,
78- 0xb7c6 , 0xb80c , 0xb852 , 0xb898 , 0xb8dd , 0xb923 , 0xb968 , 0xb9ae , 0xb9f3 ,
79- 0xba38 , 0xba7d , 0xbac1 , 0xbb06 , 0xbb4b , 0xbb8f , 0xbbd4 , 0xbc18 , 0xbc5c ,
80- 0xbca0 , 0xbce4 , 0xbd28 , 0xbd6b , 0xbdaf , 0xbdf2 , 0xbe36 , 0xbe79 , 0xbebc ,
81- 0xbeff , 0xbf42 , 0xbf85 , 0xbfc7 , 0xc00a , 0xc04c , 0xc08f , 0xc0d1 , 0xc113 ,
82- 0xc155 , 0xc197 , 0xc1d8 , 0xc21a , 0xc25c , 0xc29d , 0xc2de , 0xc31f , 0xc360 ,
83- 0xc3a1 , 0xc3e2 , 0xc423 , 0xc463 , 0xc4a4 , 0xc4e4 , 0xc524 , 0xc564 , 0xc5a4 ,
84- 0xc5e4 , 0xc624 , 0xc663 , 0xc6a3 , 0xc6e2 , 0xc721 , 0xc761 , 0xc7a0 , 0xc7de ,
85- 0xc81d , 0xc85c , 0xc89a , 0xc8d9 , 0xc917 , 0xc955 , 0xc993 , 0xc9d1 , 0xca0f ,
86- 0xca4d , 0xca8a , 0xcac7 , 0xcb05 , 0xcb42 , 0xcb7f , 0xcbbc , 0xcbf9 , 0xcc35 ,
87- 0xcc72 , 0xccae , 0xcceb , 0xcd27 , 0xcd63 , 0xcd9f , 0xcddb , 0xce17 , 0xce52 ,
88- 0xce8e , 0xcec9 , 0xcf04 , 0xcf3f , 0xcf7a , 0xcfb5 , 0xcff0 , 0xd02a , 0xd065 ,
89- 0xd09f , 0xd0d9 , 0xd113 , 0xd14d , 0xd187 , 0xd1c1 , 0xd1fa , 0xd234 , 0xd26d ,
90- 0xd2a6 , 0xd2df , 0xd318 , 0xd351 , 0xd38a , 0xd3c2 , 0xd3fb , 0xd433 , 0xd46b ,
91- 0xd4a3 , 0xd4db , 0xd513 , 0xd54b , 0xd582 , 0xd5ba , 0xd5f1 , 0xd628 , 0xd65f ,
92- 0xd696 , 0xd6cd , 0xd703 , 0xd73a , 0xd770 , 0xd7a6 , 0xd7dc , 0xd812 , 0xd848 ,
93- 0xd87e , 0xd8b4 , 0xd8e9 , 0xd91e , 0xd954 , 0xd989 , 0xd9be , 0xd9f2 , 0xda27 ,
94- 0xda5c , 0xda90 , 0xdac4 , 0xdaf8 , 0xdb2c , 0xdb60 , 0xdb94 , 0xdbc8 , 0xdbfb ,
95- 0xdc2f , 0xdc62 , 0xdc95 , 0xdcc8 , 0xdcfb , 0xdd2d , 0xdd60 , 0xdd92 , 0xddc5 ,
96- 0xddf7 , 0xde29 , 0xde5b , 0xde8c , 0xdebe , 0xdef0 , 0xdf21 , 0xdf52 , 0xdf83 ,
97- 0xdfb4 , 0xdfe5 , 0xe016 , 0xe046 , 0xe077 , 0xe0a7 , 0xe0d7 , 0xe107 , 0xe137 ,
98- 0xe167 , 0xe196 , 0xe1c6 , 0xe1f5 , 0xe224 , 0xe253 , 0xe282 , 0xe2b1 , 0xe2df ,
99- 0xe30e , 0xe33c , 0xe36b , 0xe399 , 0xe3c7 , 0xe3f4 , 0xe422 , 0xe450 , 0xe47d ,
100- 0xe4aa , 0xe4d7 , 0xe504 , 0xe531 , 0xe55e , 0xe58b , 0xe5b7 , 0xe5e3 , 0xe610 ,
101- 0xe63c , 0xe667 , 0xe693 , 0xe6bf , 0xe6ea , 0xe716 , 0xe741 , 0xe76c , 0xe797 ,
102- 0xe7c2 , 0xe7ec , 0xe817 , 0xe841 , 0xe86b , 0xe895 , 0xe8bf , 0xe8e9 , 0xe913 ,
103- 0xe93c , 0xe966 , 0xe98f , 0xe9b8 , 0xe9e1 , 0xea0a , 0xea32 , 0xea5b , 0xea83 ,
104- 0xeaab , 0xead4 , 0xeafc , 0xeb23 , 0xeb4b , 0xeb73 , 0xeb9a , 0xebc1 , 0xebe8 ,
105- 0xec0f , 0xec36 , 0xec5d , 0xec83 , 0xecaa , 0xecd0 , 0xecf6 , 0xed1c , 0xed42 ,
106- 0xed68 , 0xed8d , 0xedb3 , 0xedd8 , 0xedfd , 0xee22 , 0xee47 , 0xee6b , 0xee90 ,
107- 0xeeb4 , 0xeed9 , 0xeefd , 0xef21 , 0xef45 , 0xef68 , 0xef8c , 0xefaf , 0xefd2 ,
108- 0xeff5 , 0xf018 , 0xf03b , 0xf05e , 0xf080 , 0xf0a3 , 0xf0c5 , 0xf0e7 , 0xf109 ,
109- 0xf12b , 0xf14c , 0xf16e , 0xf18f , 0xf1b1 , 0xf1d2 , 0xf1f3 , 0xf213 , 0xf234 ,
110- 0xf254 , 0xf275 , 0xf295 , 0xf2b5 , 0xf2d5 , 0xf2f5 , 0xf314 , 0xf334 , 0xf353 ,
111- 0xf372 , 0xf391 , 0xf3b0 , 0xf3cf , 0xf3ed , 0xf40c , 0xf42a , 0xf448 , 0xf466 ,
112- 0xf484 , 0xf4a2 , 0xf4bf , 0xf4dd , 0xf4fa , 0xf517 , 0xf534 , 0xf551 , 0xf56e ,
113- 0xf58a , 0xf5a6 , 0xf5c3 , 0xf5df , 0xf5fb , 0xf616 , 0xf632 , 0xf64e , 0xf669 ,
114- 0xf684 , 0xf69f , 0xf6ba , 0xf6d5 , 0xf6ef , 0xf70a , 0xf724 , 0xf73e , 0xf758 ,
115- 0xf772 , 0xf78c , 0xf7a5 , 0xf7bf , 0xf7d8 , 0xf7f1 , 0xf80a , 0xf823 , 0xf83b ,
116- 0xf854 , 0xf86c , 0xf885 , 0xf89d , 0xf8b4 , 0xf8cc , 0xf8e4 , 0xf8fb , 0xf913 ,
117- 0xf92a , 0xf941 , 0xf958 , 0xf96e , 0xf985 , 0xf99b , 0xf9b2 , 0xf9c8 , 0xf9de ,
118- 0xf9f3 , 0xfa09 , 0xfa1f , 0xfa34 , 0xfa49 , 0xfa5e , 0xfa73 , 0xfa88 , 0xfa9c ,
119- 0xfab1 , 0xfac5 , 0xfad9 , 0xfaed , 0xfb01 , 0xfb15 , 0xfb28 , 0xfb3c , 0xfb4f ,
120- 0xfb62 , 0xfb75 , 0xfb88 , 0xfb9a , 0xfbad , 0xfbbf , 0xfbd1 , 0xfbe3 , 0xfbf5 ,
121- 0xfc07 , 0xfc18 , 0xfc2a , 0xfc3b , 0xfc4c , 0xfc5d , 0xfc6e , 0xfc7f , 0xfc8f ,
122- 0xfca0 , 0xfcb0 , 0xfcc0 , 0xfcd0 , 0xfcdf , 0xfcef , 0xfcfe , 0xfd0e , 0xfd1d ,
123- 0xfd2c , 0xfd3b , 0xfd49 , 0xfd58 , 0xfd66 , 0xfd74 , 0xfd83 , 0xfd90 , 0xfd9e ,
124- 0xfdac , 0xfdb9 , 0xfdc7 , 0xfdd4 , 0xfde1 , 0xfdee , 0xfdfa , 0xfe07 , 0xfe13 ,
125- 0xfe1f , 0xfe2b , 0xfe37 , 0xfe43 , 0xfe4f , 0xfe5a , 0xfe66 , 0xfe71 , 0xfe7c ,
126- 0xfe87 , 0xfe91 , 0xfe9c , 0xfea6 , 0xfeb0 , 0xfeba , 0xfec4 , 0xfece , 0xfed8 ,
127- 0xfee1 , 0xfeeb , 0xfef4 , 0xfefd , 0xff06 , 0xff0e , 0xff17 , 0xff1f , 0xff28 ,
128- 0xff30 , 0xff38 , 0xff3f , 0xff47 , 0xff4e , 0xff56 , 0xff5d , 0xff64 , 0xff6b ,
129- 0xff71 , 0xff78 , 0xff7e , 0xff85 , 0xff8b , 0xff91 , 0xff96 , 0xff9c , 0xffa2 ,
130- 0xffa7 , 0xffac , 0xffb1 , 0xffb6 , 0xffbb , 0xffbf , 0xffc4 , 0xffc8 , 0xffcc ,
131- 0xffd0 , 0xffd4 , 0xffd7 , 0xffdb , 0xffde , 0xffe1 , 0xffe4 , 0xffe7 , 0xffea ,
132- 0xffec , 0xffef , 0xfff1 , 0xfff3 , 0xfff5 , 0xfff7 , 0xfff8 , 0xfffa , 0xfffb ,
133- 0xfffc , 0xfffd , 0xfffe , 0xffff , 0xffff , 0xffff , 0xffff ,
134- };
135-
1369/*
13710 * angles are measured from -2048 .. 2048
13811 */
13912
14013twin_fixed_t twin_sin (twin_angle_t a )
14114{
142- twin_fixed_t sin ;
143-
144- /* limit to [0..360) */
145- a = a & (TWIN_ANGLE_360 - 1 );
146- /* special case for 90 degrees - no room in table */
147- if ((a & ~(TWIN_ANGLE_180 )) == TWIN_ANGLE_90 )
148- sin = TWIN_FIXED_ONE ;
149- else {
150- /* mirror second and third quadrant values across y axis */
151- if (a & TWIN_ANGLE_90 )
152- a = TWIN_ANGLE_180 - a ;
153- sin = _twin_sin_table [a & (TWIN_ANGLE_90 - 1 )];
154- }
155- /* mirror third and fourth quadrant values across x axis */
156- if (a & TWIN_ANGLE_180 )
157- sin = - sin ;
158- return sin ;
15+ twin_fixed_t sin_val = 0 ;
16+ twin_sincos (a , & sin_val , NULL );
17+ return sin_val ;
15918}
16019
16120twin_fixed_t twin_cos (twin_angle_t a )
16221{
163- return twin_sin (a + TWIN_ANGLE_90 );
22+ twin_fixed_t cos_val = 0 ;
23+ twin_sincos (a , NULL , & cos_val );
24+ return cos_val ;
16425}
16526
16627twin_fixed_t twin_tan (twin_angle_t a )
16728{
168- twin_fixed_t s = twin_sin ( a ) ;
169- twin_fixed_t c = twin_cos ( a );
29+ twin_fixed_t s , c ;
30+ twin_sincos ( a , & s , & c );
17031
17132 if (c == 0 ) {
17233 if (s > 0 )
@@ -178,3 +39,64 @@ twin_fixed_t twin_tan(twin_angle_t a)
17839 return 0 ;
17940 return ((s << 15 ) / c ) << 1 ;
18041}
42+
43+ static inline twin_fixed_t sin_poly (twin_angle_t x )
44+ {
45+ /* S(x) = x * 2^(-n) * (A1 - 2 ^ (q-p) * x * (2^-n) * x * 2^(-n) * (B1 - 2 ^
46+ * (-r) * x * 2 ^ (-n) * C1 * x)) * 2 ^ (a-q)
47+ * @n: the angle scale
48+ * @A: the amplitude
49+ * @p,q,r: the scaling factor
50+ *
51+ * A1 = 2^q * a5, B1 = 2 ^ p * b5, C1 = 2 ^ (r+p-n) * c5
52+ * where a5, b5, c5 are the coefficients for 5th-order polynomial
53+ * a5 = 4 * (3 / pi - 9 / 16)
54+ * b5 = 2 * a5 - 5 / 2
55+ * c5 = a5 - 3 / 2
56+ */
57+ const uint64_t A = 16 , n = 10 , p = 32 , q = 31 , r = 3 ;
58+ const uint64_t A1 = 3370945099 , B1 = 2746362156 , C1 = 2339369 ;
59+ uint64_t y = (C1 * x ) >> n ;
60+ y = B1 - ((x * y ) >> r );
61+ y = x * (y >> n );
62+ y = x * (y >> n );
63+ y = A1 - (y >> (p - q ));
64+ y = x * (y >> n );
65+ y = (y + (1UL << (q - A - 1 ))) >> (q - A ); // Rounding
66+ return y ;
67+ }
68+
69+ void twin_sincos (twin_angle_t a , twin_fixed_t * sin , twin_fixed_t * cos )
70+ {
71+ twin_fixed_t sin_val = 0 , cos_val = 0 ;
72+
73+ /* limit to [0..360) */
74+ a = a & (TWIN_ANGLE_360 - 1 );
75+ int c = a > TWIN_ANGLE_90 && a < TWIN_ANGLE_270 ;
76+ /* special case for 90 degrees */
77+ if ((a & ~(TWIN_ANGLE_180 )) == TWIN_ANGLE_90 ) {
78+ sin_val = TWIN_FIXED_ONE ;
79+ cos_val = 0 ;
80+ } else {
81+ /* mirror second and third quadrant values across y axis */
82+ if (a & TWIN_ANGLE_90 )
83+ a = TWIN_ANGLE_180 - a ;
84+ twin_angle_t x = a & (TWIN_ANGLE_90 - 1 );
85+ if (sin )
86+ sin_val = sin_poly (x );
87+ if (cos )
88+ cos_val = sin_poly (TWIN_ANGLE_90 - x );
89+ }
90+ if (sin ) {
91+ /* mirror third and fourth quadrant values across x axis */
92+ if (a & TWIN_ANGLE_180 )
93+ sin_val = - sin_val ;
94+ * sin = sin_val ;
95+ }
96+ if (cos ) {
97+ /* mirror first and fourth quadrant values across y axis */
98+ if (c )
99+ cos_val = - cos_val ;
100+ * cos = cos_val ;
101+ }
102+ }
0 commit comments