浮點數是人看的
放大 10^x 倍,浮點數�]能變整數
ex: 以 4byte 來放 2^32 = 4294967296
42949 67296
10000.00000
不�|很難放吧,忘了 pc 上所學的,你�{在的 空間、時間都是有限的,
要麻浪費時間,換取空間,要麻浪費空間、換取時間,更甚著,發揮你的大腦,賺取空間和時間。
在 mcu ,和 pc ,操�@上的�@大差異是『數值的有效合理範圍』
先搞清楚你的數值有效合理範圍
sin cos tan ,你要量測的值是多少? 0~360度 0.0~360.0度? 0.00~360.00度?
0~360度,省空間的做法就是建 0~90度,其它三個象限,調整�@下就有了
真的要算 SQRT ,用整數和浮點數,�]是相差甚遠,用32BIT整數 至少可以有正確的�|位數,夠不夠就看應用
例如 sqrt(1.243) ,改成 sqrt(1243000)放大 1000000倍,或
1.243*2^30= sqrt(1334661087)= 8EB5 >>15 次就是你的答案
了解你的數值範圍,然後放大整數,之後再計算就很快又小
小數這種東西是給人看的,不是給 machine 看的,轉成 machine 看的懂的,速度完全不�@樣
就算是用 PC 寫 ,經過分析之後的寫法�]是完全不同,以下是�@例
http://blog.ijliao.info/archives/2006/12/04/2739/
同樣是建 sin table 以下三種,表�{出 完全不同的思考羅輯,越下面,越接近 machine
cos table �]能用這樣的方式建,至於 tan 就不適合,�]為 從 -∞ ~0 ~ +∞ ,數值是很難建的,但是可以用 sin cos 在數學上取代
sin table(){
0.0000, 0.0175, 0.0349, 0.0523, 0.0698, 0.0872, 0.1045, 0.1219, 0.1392, 0.1564,
0.1736, 0.1908, 0.2079, 0.2250, 0.2419, 0.2588, 0.2756, 0.2924, 0.3090, 0.3256,
0.3420, 0.3584, 0.3746, 0.3907, 0.4067, 0.4226, 0.4384, 0.4540, 0.4695, 0.4848,
0.5000, 0.5150, 0.5299, 0.5446, 0.5592, 0.5736, 0.5878, 0.6018, 0.6157, 0.6293,
0.6428, 0.6561, 0.6691, 0.6820, 0.6947, 0.7071, 0.7193, 0.7314, 0.7431, 0.7547,
0.7660, 0.7771, 0.7880, 0.7986, 0.8090, 0.8192, 0.8290, 0.8387, 0.8480, 0.8572,
0.8660, 0.8746, 0.8829, 0.8910, 0.8988, 0.9063, 0.9135, 0.9205, 0.9272, 0.9336,
0.9397, 0.9455, 0.9511, 0.9563, 0.9613, 0.9659, 0.9703, 0.9744, 0.9781, 0.9816,
0.9848, 0.9877, 0.9903, 0.9925, 0.9945, 0.9962, 0.9976, 0.9986, 0.9994, 0.9998,
1.0000, }
sin table(){
0, 175, 349, 523, 698, 872, 1045, 1219, 1392, 1564,
1736, 1908, 2079, 2250, 2419, 2588, 2756, 2924, 3090, 3256,
3420, 3584, 3746, 3907, 4067, 4226, 4384, 4540, 4695, 4848,
5000, 5150, 5299, 5446, 5592, 5736, 5878, 6018, 6157, 6293,
6428, 6561, 6691, 6820, 6947, 7071, 7193, 7314, 7431, 7547,
7660, 7771, 7880, 7986, 8090, 8192, 8290, 8387, 8480, 8572,
8660, 8746, 8829, 8910, 8988, 9063, 9135, 9205, 9272, 9336,
9397, 9455, 9511, 9563, 9613, 9659, 9703, 9744, 9781, 9816,
9848, 9877, 9903, 9925, 9945, 9962, 9976, 9986, 9994, 9998,
10000, }
sin table(){
0, 1144, 2287, 3430, 4572, 5712, 6850, 7987, 9121, 10252,
11380, 12505, 13626, 14742, 15855, 16962, 18064, 19161, 20252, 21336,
22415, 23486, 24550, 25607, 26656, 27697, 28729, 29753, 30767, 31772,
32768, 33754, 34729, 35693, 36647, 37590, 38521, 39441, 40348, 41243,
42126, 42995, 43852, 44695, 45525, 46341, 47143, 47930, 48703, 49461,
50203, 50931, 51643, 52339, 53020, 53684, 54332, 54963, 55578, 56175,
56756, 57319, 57865, 58393, 58903, 59396, 59870, 60326, 60764, 61183,
61584, 61966, 62328, 62672, 62997, 63303, 63589, 63856, 64104, 64332,
64540, 64729, 64898, 65048, 65177, 65287, 65376, 65446, 65496, 65526,
65536, }
sin table(){
0x0000, 0x0478, 0x08EF, 0x0D66, 0x11DC, 0x1650, 0x1AC2, 0x1F33, 0x23A1, 0x280C,
0x2C74, 0x30D9, 0x353A, 0x3996, 0x3DEF, 0x4242, 0x4690, 0x4AD9, 0x4F1C, 0x5358,
0x578F, 0x5BBE, 0x5FE6, 0x6407, 0x6820, 0x6C31, 0x7039, 0x7439, 0x782F, 0x7C1C,
0x8000, 0x83DA, 0x87A9, 0x8B6D, 0x8F27, 0x92D6, 0x9679, 0x9A11, 0x9D9C, 0xA11B,
0xA48E, 0xA7F3, 0xAB4C, 0xAE97, 0xB1D5, 0xB505, 0xB827, 0xBB3A, 0xBE3F, 0xC135,
0xC41B, 0xC6F3, 0xC9BB, 0xCC73, 0xCF1C, 0xD1B4, 0xD43C, 0xD6B3, 0xD91A, 0xDB6F,
0xDDB4, 0xDFE7, 0xE209, 0xE419, 0xE617, 0xE804, 0xE9DE, 0xEBA6, 0xED5C, 0xEEFF,
0xF090, 0xF20E, 0xF378, 0xF4D0, 0xF615, 0xF747, 0xF865, 0xF970, 0xFA68, 0xFB4C,
0xFC1C, 0xFCD9, 0xFD82, 0xFE18, 0xFE99, 0xFF07, 0xFF60, 0xFFA6, 0xFFD8, 0xFFF6,
0xFFFF, } |