📄 fix_8cpp-source.html
字号:
00381 <span class="keywordflow">if</span>(a==0)00382 <span class="keywordflow">return</span> (<a class="code" href="group__fix.html#ga0">fix</a>)-0x80000000;00383 00384 <span class="comment">// calculate integer part of result in i</span>00385 <span class="comment">// and set n = normalised value of a</span>00386 <a class="code" href="group__integers.html#ga5">int32</a> i=15*0x10000;00387 <a class="code" href="group__integers.html#ga2">uint32</a> n=a;00388 <span class="keywordflow">if</span>(n<(<a class="code" href="group__integers.html#ga2">uint32</a>)(1<<(32-16)))00389 n <<= 16, i -= 16*0x10000;00390 <span class="keywordflow">if</span>(n<(<a class="code" href="group__integers.html#ga2">uint32</a>)(1<<(32-8)))00391 n <<= 8, i -= 8*0x10000;00392 <span class="keywordflow">if</span>(n<(<a class="code" href="group__integers.html#ga2">uint32</a>)(1<<(32-4)))00393 n <<= 4, i -= 4*0x10000;00394 <span class="keywordflow">if</span>(n<(<a class="code" href="group__integers.html#ga2">uint32</a>)(1<<(32-2)))00395 n <<= 2, i -= 2*0x10000;00396 <span class="keywordflow">if</span>(n<(<a class="code" href="group__integers.html#ga2">uint32</a>)(1<<(32-1)))00397 n <<= 1, i -= 1*0x10000;00398 00399 <span class="comment">// reduce n to the 23 most significant bits and clear</span>00400 <span class="comment">// the most significant bit, leaving a 22 bit value in n</span>00401 n = (n-0x80000000+(1<<8))>>9;00402 00403 <span class="comment">// calculate fractional part of result (in f) by interpolation of lookup table values</span>00404 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="group__integers.html#ga5">int32</a> LogTable[] =00405 {00406 0xffff45e1,00407 0x00000000,0x0000b73d,0x00016bad,0x00021d67,0x0002cc7f,0x00037908,0x00042316,0x0004caba,00408 0x00057007,0x0006130b,0x0006b3d8,0x0007527c,0x0007ef06,0x00088984,0x00092204,0x0009b892,00409 0x000a4d3c,0x000ae00d,0x000b7111,0x000c0053,0x000c8ddd,0x000d19bb,0x000da3f6,0x000e2c98,00410 0x000eb3aa,0x000f3935,0x000fbd43,0x00103fdb,0x0010c105,0x001140ca,0x0011bf31,0x00123c42,00411 0x0012b803,0x0013327c,0x0013abb4,0x001423b0,0x00149a78,0x00151012,0x00158482,0x0015f7d0,00412 0x00166a01,0x0016db19,0x00174b20,0x0017ba19,0x0018280a,0x001894f7,0x001900e6,0x00196bdb,00413 0x0019d5da,0x001a3ee8,0x001aa709,0x001b0e41,0x001b7495,0x001bda07,0x001c3e9d,0x001ca259,00414 0x001d053f,0x001d6754,0x001dc89a,0x001e2914,0x001e88c7,0x001ee7b4,0x001f45e1,0x001fa34e,00415 0x00200000,0x00205bf9,0x0020b73d00416 };00417 <a class="code" href="group__integers.html#ga5">int32</a> f = Interpolate(LogTable,n,16);00418 00419 <span class="comment">// scale result to 16 bits (from the 22 bit precision used in lookup table)</span>00420 f = (f+(1<<(5-1)))>>5;00421 00422 <span class="comment">// return sum of integer and fractional part</span>00423 <span class="keywordflow">return</span> i+f;00424 }00425 00426 <a name="l00427"></a><a class="code" href="classFix.html#e7">00427</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__fix.html#ga1">ufix</a> <a class="code" href="classFix.html#e7">Fix::Exp2</a>(fix a)00428 {00429 <span class="keywordflow">if</span>(a>=0x00100000)00430 <span class="keywordflow">return</span> 0xffffffffu; <span class="comment">// result will be too big so result max value</span>00431 00432 <span class="comment">// special cases for small values</span>00433 <span class="keywordflow">if</span>(a<-0x000ead96)00434 {00435 <span class="keywordflow">if</span>(a<-0x00110000)00436 <span class="keywordflow">return</span> 0;00437 <span class="keywordflow">if</span>(a<-0x000f6a3f)00438 <span class="keywordflow">return</span> 1;00439 <span class="keywordflow">return</span> 2;00440 }00441 00442 <span class="comment">// table of values for ((2^n)-1)<<32 for n in range 0x0000.0000 to 0x0000.ff00</span>00443 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="group__integers.html#ga5">int32</a> Exp2TableFF00[] = 00444 {00445 0x00000000,0x00b1afa5,0x0163da9f,0x02168143,0x02c9a3e7,0x037d42e1,0x04315e86,0x04e5f72f,00446 0x059b0d31,0x0650a0e3,0x0706b29d,0x07bd42b7,0x08745187,0x092bdf66,0x09e3ecac,0x0a9c79b1,00447 0x0b5586cf,0x0c0f145e,0x0cc922b7,0x0d83b233,0x0e3ec32d,0x0efa55fd,0x0fb66aff,0x1073028d,00448 0x11301d01,0x11edbab5,0x12abdc06,0x136a814f,0x1429aaea,0x14e95934,0x15a98c8a,0x166a4547,00449 0x172b83c7,0x17ed4869,0x18af9388,0x19726583,0x1a35beb6,0x1af99f81,0x1bbe0840,0x1c82f952,00450 0x1d487316,0x1e0e75eb,0x1ed5022f,0x1f9c1843,0x2063b886,0x212be357,0x21f49917,0x22bdda27,00451 0x2387a6e7,0x2451ffb8,0x251ce4fb,0x25e85711,0x26b4565e,0x2780e341,0x284dfe1f,0x291ba759,00452 0x29e9df51,0x2ab8a66d,0x2b87fd0d,0x2c57e397,0x2d285a6e,0x2df961f6,0x2ecafa93,0x2f9d24ab,00453 0x306fe0a3,0x31432ede,0x32170fc4,0x32eb83ba,0x33c08b26,0x3496266e,0x356c55f9,0x36431a2d,00454 0x371a7373,0x37f26231,0x38cae6d0,0x39a401b7,0x3a7db34e,0x3b57fbfe,0x3c32dc31,0x3d0e544e,00455 0x3dea64c1,0x3ec70df1,0x3fa4504a,0x40822c36,0x4160a21f,0x423fb270,0x431f5d95,0x43ffa3f8,00456 0x44e08606,0x45c2042a,0x46a41ed1,0x4786d668,0x486a2b5c,0x494e1e19,0x4a32af0d,0x4b17dea6,00457 0x4bfdad53,0x4ce41b81,0x4dcb299f,0x4eb2d81d,0x4f9b2769,0x508417f4,0x516daa2c,0x5257de83,00458 0x5342b569,0x542e2f4f,0x551a4ca5,0x56070dde,0x56f4736b,0x57e27dbe,0x58d12d49,0x59c0827f,00459 0x5ab07dd4,0x5ba11fba,0x5c9268a5,0x5d845909,0x5e76f15a,0x5f6a320d,0x605e1b97,0x6152ae6c,00460 0x6247eb03,0x633dd1d1,0x6434634c,0x652b9feb,0x66238825,0x671c1c70,0x68155d44,0x690f4b19,00461 0x6a09e667,0x6b052fa7,0x6c012750,0x6cfdcddd,0x6dfb23c6,0x6ef92985,0x6ff7df95,0x70f7466f,00462 0x71f75e8e,0x72f8286e,0x73f9a48a,0x74fbd35d,0x75feb564,0x77024b1a,0x780694fd,0x790b938a,00463 0x7a11473e,0x7b17b097,0x7c1ed013,0x7d26a62f,0x7e2f336c,0x7f387849,0x80427543,0x814d2add,00464 0x82589994,0x8364c1eb,0x8471a462,0x857f4179,0x868d99b4,0x879cad93,0x88ac7d98,0x89bd0a47,00465 0x8ace5422,0x8be05bad,0x8cf3216b,0x8e06a5e0,0x8f1ae991,0x902fed02,0x9145b0b9,0x925c353a,00466 0x93737b0c,0x948b82b5,0x95a44cbc,0x96bdd9a7,0x97d829fd,0x98f33e47,0x9a0f170c,0x9b2bb4d5,00467 0x9c49182a,0x9d674194,0x9e86319e,0x9fa5e8d0,0xa0c667b5,0xa1e7aed8,0xa309bec4,0xa42c9804,00468 0xa5503b23,0xa674a8af,0xa799e133,0xa8bfe53c,0xa9e6b557,0xab0e5213,0xac36bbfd,0xad5ff3a3,00469 0xae89f995,0xafb4ce62,0xb0e07298,0xb20ce6c9,0xb33a2b84,0xb468415b,0xb59728de,0xb6c6e29f,00470 0xb7f76f2f,0xb928cf22,0xba5b030a,0xbb8e0b79,0xbcc1e904,0xbdf69c3f,0xbf2c25bd,0xc0628614,00471 0xc199bdd8,0xc2d1cd9f,0xc40ab5ff,0xc544778f,0xc67f12e5,0xc7ba8898,0xc8f6d940,0xca340575,00472 0xcb720dce,0xccb0f2e6,0xcdf0b555,0xcf3155b5,0xd072d4a0,0xd1b532b0,0xd2f87080,0xd43c8eac,00473 0xd5818dcf,0xd6c76e86,0xd80e316c,0xd955d71f,0xda9e603d,0xdbe7cd63,0xdd321f30,0xde7d5641,00474 0xdfc97337,0xe11676b1,0xe264614f,0xe3b333b1,0xe502ee78,0xe6539246,0xe7a51fbc,0xe8f7977c,00475 0xea4afa2a,0xeb9f4867,0xecf482d8,0xee4aaa21,0xefa1bee6,0xf0f9c1cb,0xf252b376,0xf3ac948d,00476 0xf50765b6,0xf6632798,0xf7bfdad9,0xf91d8022,0xfa7c1819,0xfbdba369,0xfd3c22b8,0xfe9d96b200477 };00478 00479 <span class="comment">// table of values for ((2^n)-1)<<40 for n in range 0x0000.0000 to 0x0000.00ff</span>00480 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="group__integers.html#ga5">int32</a> Exp2Table00FF[] =00481 {00482 0x00000000,0x00b17255,0x0162e525,0x02145871,0x02c5cc37,0x03774079,0x0428b535,0x04da2a6d,00483 0x058ba01f,0x063d164d,0x06ee8cf5,0x07a00419,0x08517bb7,0x0902f3d1,0x09b46c65,0x0a65e575,00484 0x0b175eff,0x0bc8d905,0x0c7a5386,0x0d2bce81,0x0ddd49f8,0x0e8ec5e9,0x0f404256,0x0ff1bf3e,00485 0x10a33ca1,0x1154ba7e,0x120638d7,0x12b7b7ab,0x136936fa,0x141ab6c4,0x14cc3709,0x157db7c9,00486 0x162f3904,0x16e0baba,0x17923ceb,0x1843bf97,0x18f542be,0x19a6c660,0x1a584a7d,0x1b09cf16,00487 0x1bbb5429,0x1c6cd9b7,0x1d1e5fc1,0x1dcfe645,0x1e816d45,0x1f32f4bf,0x1fe47cb5,0x20960526,00488 0x21478e11,0x21f91778,0x22aaa15a,0x235c2bb7,0x240db68f,0x24bf41e2,0x2570cdb0,0x262259f9,00489 0x26d3e6bd,0x278573fd,0x283701b7,0x28e88fed,0x299a1e9d,0x2a4badc9,0x2afd3d6f,0x2baecd91,00490 0x2c605e2e,0x2d11ef46,0x2dc380d9,0x2e7512e7,0x2f26a570,0x2fd83874,0x3089cbf4,0x313b5fee,00491 0x31ecf464,0x329e8954,0x33501ec0,0x3401b4a7,0x34b34b09,0x3564e1e6,0x3616793e,0x36c81111,00492 0x3779a95f,0x382b4228,0x38dcdb6d,0x398e752c,0x3a400f67,0x3af1aa1d,0x3ba3454e,0x3c54e0fa,00493 0x3d067d21,0x3db819c3,0x3e69b6e0,0x3f1b5479,0x3fccf28c,0x407e911b,0x41303025,0x41e1cfaa,00494 0x42936faa,0x43451025,0x43f6b11b,0x44a8528d,0x4559f479,0x460b96e1,0x46bd39c3,0x476edd21,00495 0x482080fa,0x48d2254e,0x4983ca1e,0x4a356f68,0x4ae7152e,0x4b98bb6e,0x4c4a622a,0x4cfc0961,00496 0x4dadb113,0x4e5f5941,0x4f1101e9,0x4fc2ab0d,0x507454ab,0x5125fec5,0x51d7a95a,0x5289546a,00497 0x533afff5,0x53ecabfc,0x549e587d,0x5550057a,0x5601b2f2,0x56b360e5,0x57650f53,0x5816be3d,00498 0x58c86da1,0x597a1d81,0x5a2bcddc,0x5add7eb2,0x5b8f3003,0x5c40e1cf,0x5cf29417,0x5da446da,00499 0x5e55fa17,0x5f07add1,0x5fb96205,0x606b16b4,0x611ccbdf,0x61ce8184,0x628037a5,0x6331ee41,00500 0x63e3a559,0x64955ceb,0x654714f9,0x65f8cd82,0x66aa8686,0x675c4005,0x680df9ff,0x68bfb475,00501 0x69716f66,0x6a232ad2,0x6ad4e6b9,0x6b86a31b,0x6c385ff9,0x6cea1d52,0x6d9bdb26,0x6e4d9975,00502 0x6eff583f,0x6fb11785,0x7062d746,0x71149782,0x71c65839,0x7278196b,0x7329db19,0x73db9d42,00503 0x748d5fe6,0x753f2305,0x75f0e6a0,0x76a2aab5,0x77546f46,0x78063452,0x78b7f9da,0x7969bfdc,00504 0x7a1b865a,0x7acd4d53,0x7b7f14c7,0x7c30dcb7,0x7ce2a522,0x7d946e07,0x7e463769,0x7ef80145,00505 0x7fa9cb9d,0x805b9670,0x810d61be,0x81bf2d87,0x8270f9cc,0x8322c68c,0x83d493c7,0x8486617d,00506 0x85382fae,0x85e9fe5b,0x869bcd83,0x874d9d27,0x87ff6d45,0x88b13ddf,0x89630ef4,0x8a14e084,00507 0x8ac6b290,0x8b788517,0x8c2a5819,0x8cdc2b96,0x8d8dff8f,0x8e3fd403,0x8ef1a8f2,0x8fa37e5c,00508 0x90555442,0x91072aa3,0x91b9017f,0x926ad8d6,0x931cb0a9,0x93ce88f7,0x948061c0,0x95323b05,00509 0x95e414c5,0x9695ef00,0x9747c9b6,0x97f9a4e8,0x98ab8095,0x995d5cbd,0x9a0f3961,0x9ac1167f,00510 0x9b72f41a,0x9c24d22f,0x9cd6b0c0,0x9d888fcc,0x9e3a6f53,0x9eec4f55,0x9f9e2fd3,0xa05010cc,00511 0xa101f241,0xa1b3d430,0xa265b69b,0xa3179982,0xa3c97ce3,0xa47b60c0,0xa52d4519,0xa5df29ec,00512 0xa6910f3b,0xa742f505,0xa7f4db4b,0xa8a6c20b,0xa958a947,0xaa0a90ff,0xaabc7932,0xab6e61e0,00513 0xac204b09,0xacd234ae,0xad841ece,0xae360969,0xaee7f480,0xaf99e011,0xb04bcc1f,0xb0fdb8a700514 };00515 00516 <span class="comment">// Treat 'a' as i+j+k where i is integer part of value, j is bits 15 to 8 of </span>00517 <span class="comment">// the fractional part and k is bits 7 to 0 of the fractional part </span>00518 <span class="comment">// We calculate 2^a as 2^(i+j+k) which is (2^i)*(2^j)*(2^k)</span>00519 00520 <span class="keywordtype">int</span> i = a>>16; <span class="comment">// i = integer part of value</span>00521 <a class="code" href="group__integers.html#ga2">uint32</a> x=Exp2TableFF00[(a>>8)&0xff]; <span class="comment">// x = (2^j-1) << 32</span>00522 <a class="code" href="group__integers.html#ga2">uint32</a> y=Exp2Table00FF[a&0xff]; <span class="comment">// y = (2^k-1) << 40</span>00523 00524 <span class="comment">// calculate p = (x*y)>>32 = (2^j-1)(2^k-1)<<40</span>00525 <a class="code" href="group__integers.html#ga2">uint32</a> xl = x&0xffff;00526 <a class="code" href="group__integers.html#ga2">uint32</a> yl = y&0xffff;00527 <a class="code" href="group__integers.html#ga2">uint32</a> xh = x>>16;00528 <a class="code" href="group__integers.html#ga2">uint32</a> yh = y>>16;00529 <a class="code" href="group__integers.html#ga2">uint32</a> pl = (xl*yl+(1<<15))>>16;00530 <a class="code" href="group__integers.html#ga2">uint32</a> pm1 = xh*yl+pl;00531 <a class="code" href="group__integers.html#ga2">uint32</a> pm2 = xl*yh;00532 <a class="code" href="group__integers.html#ga6">uint</a> p = xh*yh;00533 <a class="code" href="group__integers.html#ga2">uint32</a> pm = pm1+pm2;00534 <span class="keywordflow">if</span>(pm<pm2) p += (1<<16); <span class="comment">// check for carry</span>00535 <span class="keywordflow">if</span>(pm&(1<<15)) p += 1; <span class="comment">// round up if required</span>00536 p += pm>>16;00537 00538 <span class="comment">// calculate n = p+x+y = x*y+x+y = (x+1)(y+1)-1 = ((2^j)(2^k)-1)<<32</span>00539 <a class="code" href="group__integers.html#ga6">uint</a> round = ((p&0xff)+(y&0xff)+0x80)>>8;00540 <a class="code" href="group__integers.html#ga6">uint</a> n = x+(y>>8)+round;00541 n += p>>8;00542 00543 <span class="comment">// n = n>>(16-i) = 2^(i-16)*n = ((2^i)*((2^j)*(2^k)-1)<<16</span>00544 n >>= 15-i;00545 n = (n+1)>>1;00546 00547 <span class="comment">// finally add 2^i to get result of 2^a</span>00548 n += 0x80000000>>(15-i);00549 00550 <span class="keywordflow">return</span> n;00551 }00552 00553 <a name="l00554"></a><a class="code" href="classFix.html#e9">00554</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__fix.html#ga0">fix</a> <a class="code" href="classFix.html#e9">Fix::Cos</a>(fixangle angle)00555 {00556 <span class="keywordflow">return</span> <a class="code" href="classFix.html#e8">Fix::Sin</a>(angle+0x4000);00557 }00558 00559 <a name="l00560"></a><a class="code" href="classFix.html#e8">00560</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__fix.html#ga0">fix</a> <a class="code" href="classFix.html#e8">Fix::Sin</a>(fixangle angle)00561 {00562 <span class="comment">// reduce angle to first quadrant</span>00563 <a class="code" href="group__integers.html#ga6">uint</a> n = angle&0x3FFF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -