Уголок коптер-программиста

mahowik
Gene:

инвертированнный квадратный корень 1/sqrt(x)

а вот виевский вариант схожий

float InvSqrt (float x){
  union{
    int32_t i;
    float   f;
  } conv;
  conv.f = x;
  conv.i = 0x5f3759df - (conv.i >> 1);
  return 0.5f * conv.f * (3.0f - x * conv.f * conv.f);
}
Gene:

не atan2, и не целочисленный

целочисленный тоже может быть полезен

int16_t _atan2(float y, float x){
  #define fp_is_neg(val) ((((uint8_t*)&val)[3] & 0x80) != 0)
  float z = y / x;
  int16_t zi = abs(int16_t(z * 100));
  int8_t y_neg = fp_is_neg(y);
  if ( zi < 100 ){
    if (zi > 10)
     z = z / (1.0f + 0.28f * z * z);
   if (fp_is_neg(x)) {
     if (y_neg) z -= PI;
     else z += PI;
   }
  } else {
   z = (PI / 2.0f) - z / (z * z + 0.28f);
   if (y_neg) z -= PI;
  }
  z *= (180.0f / PI * 10);
  return z;
}

ну и простейшие аппроксимации для малых углов

// Small angle approximation
#define ssin(val) (val)
#define scos(val) 1.0f
serj
Sir_Alex:

Сказали, А, говорите и В 😃 в смысле, register map…
Увы, я свой выложить не могу, лицензионное соглашение сдуру на себя подписал.

Gene
mahowik:

целочисленный тоже может быть полезен

Конечно же, я просто думал, мультивиевский код и так у каждого всегда есть в виде справочника 😉
И кстати его можно немного убыстрить, имхо, введя пару констант (например, зачем каждый раз заново вычислять (180.0f / PI * 10)?)

mahowik
Gene:

зачем каждый раз заново вычислять (180.0f / PI * 10)

такие штуки компилятор оптимизирует обычно…

на работе быстро накидал на java тестик… в аппроксимированной _sin(x), в сравнении с библиотечной sin(x), точность примерно 2 знака после запятой (иногда 3)… корректно работает только в диапазоне -180…180, т.е. надо приводить к этому диапазону…

static float _sin (float x) {
        x = x * 0.31831f;
        float y = x - x * Math.abs(x);
        return y * (3.1f + 3.6f * Math.abs(y));
    }

    public static void main(String[] args) {
        for(int i=-180; i<=180; i++) {
            System.out.println("angle=" + i + ", _sin=" + _sin((float)(i*Math.PI/180.0f))+ ", sin=" + Math.sin((float)(i*Math.PI/180.0f)));
        }
    }
angle=-180, _sin=1.1086468E-6, sin=8.742278000372475E-8
angle=-179, _sin=-0.01723531, sin=-0.017452458569748835
angle=-178, _sin=-0.034495354, sin=-0.03489945001597251
angle=-177, _sin=-0.051771555, sin=-0.05233604896389903
angle=-176, _sin=-0.0690567, sin=-0.06975646775156666
angle=-175, _sin=-0.086343676, sin=-0.08715563828410712
angle=-174, _sin=-0.10362564, sin=-0.10452849777816209
angle=-173, _sin=-0.12089543, sin=-0.121869279728557
angle=-172, _sin=-0.13814639, sin=-0.139173175634592
angle=-171, _sin=-0.15537152, sin=-0.15643444188190603
angle=-170, _sin=-0.17256433, sin=-0.17364829201905368
angle=-169, _sin=-0.18971775, sin=-0.19080901232021316
angle=-168, _sin=-0.20682546, sin=-0.20791161100620165
angle=-167, _sin=-0.22388165, sin=-0.22495111082672528
angle=-166, _sin=-0.24087885, sin=-0.24192185592737964
angle=-165, _sin=-0.25781164, sin=-0.25881914041658916
angle=-164, _sin=-0.27467316, sin=-0.2756373556449271
angle=-163, _sin=-0.29145747, sin=-0.29237161001566847
angle=-162, _sin=-0.3081592, sin=-0.3090170329201147
angle=-161, _sin=-0.3247713, sin=-0.3255680993082677
angle=-160, _sin=-0.34128875, sin=-0.3420202196630839
angle=-159, _sin=-0.35770506, sin=-0.3583679330967232
angle=-158, _sin=-0.37401477, sin=-0.37460648542290864
angle=-157, _sin=-0.39021266, sin=-0.3907311497427947
angle=-156, _sin=-0.4062925, sin=-0.40673657385973994
angle=-155, _sin=-0.4222493, sin=-0.42261831956021456
angle=-154, _sin=-0.4380774, sin=-0.4383711152786025
angle=-153, _sin=-0.45377177, sin=-0.45399059285379917
angle=-152, _sin=-0.46932665, sin=-0.4694715677738196
angle=-151, _sin=-0.4847377, sin=-0.4848095387263436
angle=-150, _sin=-0.49999925, sin=-0.5000000401463156
angle=-149, _sin=-0.51510644, sin=-0.5150380299101248
angle=-148, _sin=-0.5300546, sin=-0.5299193380683128
angle=-147, _sin=-0.54483837, sin=-0.5446390251265764
angle=-146, _sin=-0.55945355, sin=-0.5591928117410372
angle=-145, _sin=-0.57389545, sin=-0.5735764600386035
angle=-144, _sin=-0.5881591, sin=-0.5877851957112599
angle=-143, _sin=-0.6022406, sin=-0.6018150787570143
angle=-142, _sin=-0.61613524, sin=-0.6156614522917649
angle=-141, _sin=-0.6298385, sin=-0.6293204767944899
angle=-140, _sin=-0.64334637, sin=-0.6427876184787104
angle=-139, _sin=-0.6566547, sin=-0.6560589630454696
angle=-138, _sin=-0.6697596, sin=-0.6691306451399875
angle=-137, _sin=-0.68265647, sin=-0.6819983259300492
angle=-136, _sin=-0.69534194, sin=-0.6946584372805921
angle=-135, _sin=-0.70781195, sin=-0.7071067769704655
angle=-134, _sin=-0.72006273, sin=-0.7193397275260623
angle=-133, _sin=-0.7320911, sin=-0.7313537253154444
angle=-132, _sin=-0.7438928, sin=-0.7431447825794036
angle=-131, _sin=-0.75546485, sin=-0.7547096297244889
angle=-130, _sin=-0.7668034, sin=-0.7660444280763049
angle=-129, _sin=-0.7779053, sin=-0.7771460345594151
angle=-128, _sin=-0.78876746, sin=-0.788010764261082
angle=-127, _sin=-0.7993865, sin=-0.7986354609693695
angle=-126, _sin=-0.80975956, sin=-0.8090170284743339
angle=-125, _sin=-0.8198833, sin=-0.8191520208629542
angle=-124, _sin=-0.8297553, sin=-0.8290376277591972
angle=-123, _sin=-0.83937204, sin=-0.8386705678723035
angle=-122, _sin=-0.8487313, sin=-0.8480480436999007
angle=-121, _sin=-0.85783035, sin=-0.8571673215990291
angle=-120, _sin=-0.8666663, sin=-0.8660253746435105
angle=-119, _sin=-0.875237, sin=-0.8746197465453652
angle=-118, _sin=-0.8835396, sin=-0.8829475846084057
angle=-117, _sin=-0.8915722, sin=-0.8910064713304968
angle=-116, _sin=-0.8993323, sin=-0.8987940564403286
angle=-115, _sin=-0.90681773, sin=-0.906307755035292
angle=-114, _sin=-0.9140264, sin=-0.9135454351225024
angle=-113, _sin=-0.9209564, sin=-0.9205048397714333
angle=-112, _sin=-0.9276055, sin=-0.9271838490750671
angle=-111, _sin=-0.93397224, sin=-0.9335804285377239
angle=-110, _sin=-0.9400546, sin=-0.9396926296947897
angle=-109, _sin=-0.945851, sin=-0.9455185907062396
angle=-108, _sin=-0.95135975, sin=-0.9510565000860774
angle=-107, _sin=-0.9565795, sin=-0.9563047465779703
angle=-106, _sin=-0.9615086, sin=-0.9612616927007172
angle=-105, _sin=-0.9661457, sin=-0.9659258285169886
angle=-104, _sin=-0.9704895, sin=-0.9702957332825187
angle=-103, _sin=-0.9745392, sin=-0.9743700758788791
angle=-102, _sin=-0.9782931, sin=-0.9781475904339476
angle=-101, _sin=-0.98175067, sin=-0.9816271778787736
angle=-100, _sin=-0.98491067, sin=-0.9848077514785853
angle=-99, _sin=-0.98777235, sin=-0.9876883423975937
angle=-98, _sin=-0.9903349, sin=-0.9902680731778534
angle=-97, _sin=-0.9925977, sin=-0.9925461580065456
angle=-96, _sin=-0.99455994, sin=-0.9945218904945822
angle=-95, _sin=-0.9962212, sin=-0.9961946958020256
angle=-94, _sin=-0.9975811, sin=-0.9975640498470272
angle=-93, _sin=-0.9986391, sin=-0.9986295355101066
angle=-92, _sin=-0.999395, sin=-0.9993908282332523
angle=-91, _sin=-0.99984866, sin=-0.9998476961187852
angle=-90, _sin=-1.0, sin=-0.999999999999999
angle=-89, _sin=-0.9998488, sin=-0.9998476955640354
angle=-88, _sin=-0.99939513, sin=-0.9993908271239197
angle=-87, _sin=-0.99863917, sin=-0.9986295338465291
angle=-86, _sin=-0.9975811, sin=-0.9975640476297116
angle=-85, _sin=-0.9962213, sin=-0.9961946930316474
angle=-84, _sin=-0.99456, sin=-0.9945218996327513
angle=-83, _sin=-0.99259776, sin=-0.9925461541327456
angle=-82, _sin=-0.9903351, sin=-0.9902680687540267
angle=-81, _sin=-0.9877725, sin=-0.9876883374250879
angle=-80, _sin=-0.98491085, sin=-0.9848077459589151
angle=-79, _sin=-0.9817509, sin=-0.9816271945598252
angle=-78, _sin=-0.9782934, sin=-0.978147608610166
angle=-77, _sin=-0.97453934, sin=-0.9743700687284713
angle=-76, _sin=-0.9704898, sin=-0.9702957255926664
angle=-75, _sin=-0.96614593, sin=-0.9659258202900343
angle=-74, _sin=-0.9615088, sin=-0.9612616839391669
angle=-73, _sin=-0.9565797, sin=-0.9563047721379165
angle=-72, _sin=-0.9513601, sin=-0.9510565271012029
angle=-71, _sin=-0.9458514, sin=-0.9455185803575653
angle=-70, _sin=-0.94005495, sin=-0.9396926188231635
angle=-69, _sin=-0.9339726, sin=-0.9335804171464573
angle=-68, _sin=-0.9276059, sin=-0.9271838371676302
angle=-67, _sin=-0.92095673, sin=-0.9205048739302341
angle=-66, _sin=-0.9140268, sin=-0.9135454706805514
angle=-65, _sin=-0.90681815, sin=-0.9063077919817579
angle=-64, _sin=-0.8993327, sin=-0.8987940425060401
angle=-63, _sin=-0.89157265, sin=-0.891006511019614
angle=-62, _sin=-0.88354015, sin=-0.8829475696855424
angle=-61, _sin=-0.8752374, sin=-0.8746197311349614
angle=-60, _sin=-0.86666685, sin=-0.8660254183549017
angle=-59, _sin=-0.8578308, sin=-0.8571673052277671
angle=-58, _sin=-0.84873194, sin=-0.84804809002692
angle=-57, _sin=-0.83937275, sin=-0.8386705830231456
angle=-56, _sin=-0.8297557, sin=-0.8290375766539163
angle=-55, _sin=-0.81988394, sin=-0.8191520368187817
angle=-54, _sin=-0.80976015, sin=-0.8090170097906934
angle=-53, _sin=-0.7993872, sin=-0.7986355135817145
angle=-52, _sin=-0.7887682, sin=-0.7880107446913527
angle=-51, _sin=-0.77790606, sin=-0.7771459770451031
angle=-50, _sin=-0.76680404, sin=-0.7660444459574578
angle=-49, _sin=-0.7554653, sin=-0.7547095697664989
angle=-48, _sin=-0.74389344, sin=-0.7431448410766628
angle=-47, _sin=-0.7320918, sin=-0.7313537036370974
angle=-46, _sin=-0.7200635, sin=-0.7193397882550321
angle=-45, _sin=-0.70781267, sin=-0.7071067966408575
angle=-44, _sin=-0.6953426, sin=-0.6946583715393003
angle=-43, _sin=-0.6826571, sin=-0.6819983462749459
angle=-42, _sin=-0.66976017, sin=-0.6691306215180083
angle=-41, _sin=-0.6566555, sin=-0.6560590290242818
angle=-40, _sin=-0.6433472, sin=-0.6427875941288312
angle=-39, _sin=-0.6298393, sin=-0.6293204057702271
angle=-38, _sin=-0.616136, sin=-0.6156614742127549
angle=-37, _sin=-0.6022415, sin=-0.6018150057687945
angle=-36, _sin=-0.58816016, sin=-0.587785266437776
angle=-35, _sin=-0.5738963, sin=-0.5735764340006195
angle=-34, _sin=-0.5594545, sin=-0.5591928842178098
angle=-33, _sin=-0.5448393, sin=-0.5446390484568276
angle=-32, _sin=-0.53005534, sin=-0.5299192605642203
angle=-31, _sin=-0.51510733, sin=-0.5150380537549213
angle=-30, _sin=-0.5000001, sin=-0.5000000126183913
angle=-29, _sin=-0.4847386, sin=-0.48480961518803195
angle=-28, _sin=-0.46932775, sin=-0.46947156602188633
angle=-27, _sin=-0.4537726, sin=-0.45399051142368685
angle=-26, _sin=-0.43807837, sin=-0.4383711402813771
angle=-25, _sin=-0.42225024, sin=-0.42261826374177747
angle=-24, _sin=-0.40629345, sin=-0.40673665372442463
angle=-23, _sin=-0.39021346, sin=-0.3907311204831585
angle=-22, _sin=-0.3740158, sin=-0.37460659411213343
angle=-21, _sin=-0.35770595, sin=-0.3583679590671898
angle=-20, _sin=-0.34128952, sin=-0.34202013378349166
angle=-19, _sin=-0.32477233, sin=-0.32556815378948123
angle=-18, _sin=-0.30816013, sin=-0.3090170026893479
angle=-17, _sin=-0.2914587, sin=-0.2923716936184902
angle=-16, _sin=-0.2746742, sin=-0.27563735373760395
angle=-15, _sin=-0.2578126, sin=-0.25881905213951417
angle=-14, _sin=-0.24087997, sin=-0.2419218973777306
angle=-13, _sin=-0.22388259, sin=-0.2249510508164115
angle=-12, _sin=-0.20682673, sin=-0.20791169651858482
angle=-11, _sin=-0.18971878, sin=-0.19080899574509624
angle=-10, _sin=-0.1725652, sin=-0.17364817266677937
angle=-9, _sin=-0.15537256, sin=-0.1564344693575539
angle=-8, _sin=-0.13814743, sin=-0.13917309988899462
angle=-7, _sin=-0.12089655, sin=-0.12186934431456582
angle=-6, _sin=-0.1036267, sin=-0.10452846616578243
angle=-5, _sin=-0.08634476, sin=-0.0871557402186753
angle=-4, _sin=-0.06905769, sin=-0.06975647320464423
angle=-3, _sin=-0.051772516, sin=-0.05233595769799333
angle=-2, _sin=-0.034496363, sin=-0.03489949643226648
angle=-1, _sin=-0.01723643, sin=-0.017452406302104498
angle=0, _sin=0.0, sin=0.0
angle=1, _sin=0.01723643, sin=0.017452406302104498
angle=2, _sin=0.034496363, sin=0.03489949643226648
angle=3, _sin=0.051772516, sin=0.05233595769799333
angle=4, _sin=0.06905769, sin=0.06975647320464423
angle=5, _sin=0.08634476, sin=0.0871557402186753
angle=6, _sin=0.1036267, sin=0.10452846616578243
angle=7, _sin=0.12089655, sin=0.12186934431456582
angle=8, _sin=0.13814743, sin=0.13917309988899462
angle=9, _sin=0.15537256, sin=0.1564344693575539
angle=10, _sin=0.1725652, sin=0.17364817266677937
angle=11, _sin=0.18971878, sin=0.19080899574509624
angle=12, _sin=0.20682673, sin=0.20791169651858482
angle=13, _sin=0.22388259, sin=0.2249510508164115
angle=14, _sin=0.24087997, sin=0.2419218973777306
angle=15, _sin=0.2578126, sin=0.25881905213951417
angle=16, _sin=0.2746742, sin=0.27563735373760395
angle=17, _sin=0.2914587, sin=0.2923716936184902
angle=18, _sin=0.30816013, sin=0.3090170026893479
angle=19, _sin=0.32477233, sin=0.32556815378948123
angle=20, _sin=0.34128952, sin=0.34202013378349166
angle=21, _sin=0.35770595, sin=0.3583679590671898
angle=22, _sin=0.3740158, sin=0.37460659411213343
angle=23, _sin=0.39021346, sin=0.3907311204831585
angle=24, _sin=0.40629345, sin=0.40673665372442463
angle=25, _sin=0.42225024, sin=0.42261826374177747
angle=26, _sin=0.43807837, sin=0.4383711402813771
angle=27, _sin=0.4537726, sin=0.45399051142368685
angle=28, _sin=0.46932775, sin=0.46947156602188633
angle=29, _sin=0.4847386, sin=0.48480961518803195
angle=30, _sin=0.5000001, sin=0.5000000126183913
angle=31, _sin=0.51510733, sin=0.5150380537549213
angle=32, _sin=0.53005534, sin=0.5299192605642203
angle=33, _sin=0.5448393, sin=0.5446390484568276
angle=34, _sin=0.5594545, sin=0.5591928842178098
angle=35, _sin=0.5738963, sin=0.5735764340006195
angle=36, _sin=0.58816016, sin=0.587785266437776
angle=37, _sin=0.6022415, sin=0.6018150057687945
angle=38, _sin=0.616136, sin=0.6156614742127549
angle=39, _sin=0.6298393, sin=0.6293204057702271
angle=40, _sin=0.6433472, sin=0.6427875941288312
angle=41, _sin=0.6566555, sin=0.6560590290242818
angle=42, _sin=0.66976017, sin=0.6691306215180083
angle=43, _sin=0.6826571, sin=0.6819983462749459
angle=44, _sin=0.6953426, sin=0.6946583715393003
angle=45, _sin=0.70781267, sin=0.7071067966408575
angle=46, _sin=0.7200635, sin=0.7193397882550321
angle=47, _sin=0.7320918, sin=0.7313537036370974
angle=48, _sin=0.74389344, sin=0.7431448410766628
angle=49, _sin=0.7554653, sin=0.7547095697664989
angle=50, _sin=0.76680404, sin=0.7660444459574578
angle=51, _sin=0.77790606, sin=0.7771459770451031
angle=52, _sin=0.7887682, sin=0.7880107446913527
angle=53, _sin=0.7993872, sin=0.7986355135817145
angle=54, _sin=0.80976015, sin=0.8090170097906934
angle=55, _sin=0.81988394, sin=0.8191520368187817
angle=56, _sin=0.8297557, sin=0.8290375766539163
angle=57, _sin=0.83937275, sin=0.8386705830231456
angle=58, _sin=0.84873194, sin=0.84804809002692
angle=59, _sin=0.8578308, sin=0.8571673052277671
angle=60, _sin=0.86666685, sin=0.8660254183549017
angle=61, _sin=0.8752374, sin=0.8746197311349614
angle=62, _sin=0.88354015, sin=0.8829475696855424
angle=63, _sin=0.89157265, sin=0.891006511019614
angle=64, _sin=0.8993327, sin=0.8987940425060401
angle=65, _sin=0.90681815, sin=0.9063077919817579
angle=66, _sin=0.9140268, sin=0.9135454706805514
angle=67, _sin=0.92095673, sin=0.9205048739302341
angle=68, _sin=0.9276059, sin=0.9271838371676302
angle=69, _sin=0.9339726, sin=0.9335804171464573
angle=70, _sin=0.94005495, sin=0.9396926188231635
angle=71, _sin=0.9458514, sin=0.9455185803575653
angle=72, _sin=0.9513601, sin=0.9510565271012029
angle=73, _sin=0.9565797, sin=0.9563047721379165
angle=74, _sin=0.9615088, sin=0.9612616839391669
angle=75, _sin=0.96614593, sin=0.9659258202900343
angle=76, _sin=0.9704898, sin=0.9702957255926664
angle=77, _sin=0.97453934, sin=0.9743700687284713
angle=78, _sin=0.9782934, sin=0.978147608610166
angle=79, _sin=0.9817509, sin=0.9816271945598252
angle=80, _sin=0.98491085, sin=0.9848077459589151
angle=81, _sin=0.9877725, sin=0.9876883374250879
angle=82, _sin=0.9903351, sin=0.9902680687540267
angle=83, _sin=0.99259776, sin=0.9925461541327456
angle=84, _sin=0.99456, sin=0.9945218996327513
angle=85, _sin=0.9962213, sin=0.9961946930316474
angle=86, _sin=0.9975811, sin=0.9975640476297116
angle=87, _sin=0.99863917, sin=0.9986295338465291
angle=88, _sin=0.99939513, sin=0.9993908271239197
angle=89, _sin=0.9998488, sin=0.9998476955640354
angle=90, _sin=1.0, sin=0.999999999999999
angle=91, _sin=0.99984866, sin=0.9998476961187852
angle=92, _sin=0.999395, sin=0.9993908282332523
angle=93, _sin=0.9986391, sin=0.9986295355101066
angle=94, _sin=0.9975811, sin=0.9975640498470272
angle=95, _sin=0.9962212, sin=0.9961946958020256
angle=96, _sin=0.99455994, sin=0.9945218904945822
angle=97, _sin=0.9925977, sin=0.9925461580065456
angle=98, _sin=0.9903349, sin=0.9902680731778534
angle=99, _sin=0.98777235, sin=0.9876883423975937
angle=100, _sin=0.98491067, sin=0.9848077514785853
angle=101, _sin=0.98175067, sin=0.9816271778787736
angle=102, _sin=0.9782931, sin=0.9781475904339476
angle=103, _sin=0.9745392, sin=0.9743700758788791
angle=104, _sin=0.9704895, sin=0.9702957332825187
angle=105, _sin=0.9661457, sin=0.9659258285169886
angle=106, _sin=0.9615086, sin=0.9612616927007172
angle=107, _sin=0.9565795, sin=0.9563047465779703
angle=108, _sin=0.95135975, sin=0.9510565000860774
angle=109, _sin=0.945851, sin=0.9455185907062396
angle=110, _sin=0.9400546, sin=0.9396926296947897
angle=111, _sin=0.93397224, sin=0.9335804285377239
angle=112, _sin=0.9276055, sin=0.9271838490750671
angle=113, _sin=0.9209564, sin=0.9205048397714333
angle=114, _sin=0.9140264, sin=0.9135454351225024
angle=115, _sin=0.90681773, sin=0.906307755035292
angle=116, _sin=0.8993323, sin=0.8987940564403286
angle=117, _sin=0.8915722, sin=0.8910064713304968
angle=118, _sin=0.8835396, sin=0.8829475846084057
angle=119, _sin=0.875237, sin=0.8746197465453652
angle=120, _sin=0.8666663, sin=0.8660253746435105
angle=121, _sin=0.85783035, sin=0.8571673215990291
angle=122, _sin=0.8487313, sin=0.8480480436999007
angle=123, _sin=0.83937204, sin=0.8386705678723035
angle=124, _sin=0.8297553, sin=0.8290376277591972
angle=125, _sin=0.8198833, sin=0.8191520208629542
angle=126, _sin=0.80975956, sin=0.8090170284743339
angle=127, _sin=0.7993865, sin=0.7986354609693695
angle=128, _sin=0.78876746, sin=0.788010764261082
angle=129, _sin=0.7779053, sin=0.7771460345594151
angle=130, _sin=0.7668034, sin=0.7660444280763049
angle=131, _sin=0.75546485, sin=0.7547096297244889
angle=132, _sin=0.7438928, sin=0.7431447825794036
angle=133, _sin=0.7320911, sin=0.7313537253154444
angle=134, _sin=0.72006273, sin=0.7193397275260623
angle=135, _sin=0.70781195, sin=0.7071067769704655
angle=136, _sin=0.69534194, sin=0.6946584372805921
angle=137, _sin=0.68265647, sin=0.6819983259300492
angle=138, _sin=0.6697596, sin=0.6691306451399875
angle=139, _sin=0.6566547, sin=0.6560589630454696
angle=140, _sin=0.64334637, sin=0.6427876184787104
angle=141, _sin=0.6298385, sin=0.6293204767944899
angle=142, _sin=0.61613524, sin=0.6156614522917649
angle=143, _sin=0.6022406, sin=0.6018150787570143
angle=144, _sin=0.5881591, sin=0.5877851957112599
angle=145, _sin=0.57389545, sin=0.5735764600386035
angle=146, _sin=0.55945355, sin=0.5591928117410372
angle=147, _sin=0.54483837, sin=0.5446390251265764
angle=148, _sin=0.5300546, sin=0.5299193380683128
angle=149, _sin=0.51510644, sin=0.5150380299101248
angle=150, _sin=0.49999925, sin=0.5000000401463156
angle=151, _sin=0.4847377, sin=0.4848095387263436
angle=152, _sin=0.46932665, sin=0.4694715677738196
angle=153, _sin=0.45377177, sin=0.45399059285379917
angle=154, _sin=0.4380774, sin=0.4383711152786025
angle=155, _sin=0.4222493, sin=0.42261831956021456
angle=156, _sin=0.4062925, sin=0.40673657385973994
angle=157, _sin=0.39021266, sin=0.3907311497427947
angle=158, _sin=0.37401477, sin=0.37460648542290864
angle=159, _sin=0.35770506, sin=0.3583679330967232
angle=160, _sin=0.34128875, sin=0.3420202196630839
angle=161, _sin=0.3247713, sin=0.3255680993082677
angle=162, _sin=0.3081592, sin=0.3090170329201147
angle=163, _sin=0.29145747, sin=0.29237161001566847
angle=164, _sin=0.27467316, sin=0.2756373556449271
angle=165, _sin=0.25781164, sin=0.25881914041658916
angle=166, _sin=0.24087885, sin=0.24192185592737964
angle=167, _sin=0.22388165, sin=0.22495111082672528
angle=168, _sin=0.20682546, sin=0.20791161100620165
angle=169, _sin=0.18971775, sin=0.19080901232021316
angle=170, _sin=0.17256433, sin=0.17364829201905368
angle=171, _sin=0.15537152, sin=0.15643444188190603
angle=172, _sin=0.13814639, sin=0.139173175634592
angle=173, _sin=0.12089543, sin=0.121869279728557
angle=174, _sin=0.10362564, sin=0.10452849777816209
angle=175, _sin=0.086343676, sin=0.08715563828410712
angle=176, _sin=0.0690567, sin=0.06975646775156666
angle=177, _sin=0.051771555, sin=0.05233604896389903
angle=178, _sin=0.034495354, sin=0.03489945001597251
angle=179, _sin=0.01723531, sin=0.017452458569748835
angle=180, _sin=-1.1086468E-6, sin=-8.742278000372475E-8

надо будет еще на ардуине прогнать и посмотреть выигрышь в производительности… если хотябы в 2-3 раза, то уже можно будет и матрицы крутить на AVR-ке с частотой 150-200гц…

Gene
mahowik:

такие штуки компилятор оптимизирует обычно…

Не знал. Это показывает, насколько я чайник в программировании 😃

Но вообще мне и сейчас кажется, что спокойнее все же посчитать константы самому, особенно если они используются в других функциях…

mahowik

для косинуса картинка еще лучше… практически стабильные 3 знака после запятой…

angle=-180, _cos=-1.0, cos=-0.9999999999999962
angle=-179, _cos=-0.9998488, cos=-0.9998476942464143
angle=-178, _cos=-0.99939513, cos=-0.9993908286494242
angle=-177, _cos=-0.99863917, cos=-0.9986295298952702
angle=-176, _cos=-0.9975812, cos=-0.9975640506788648
angle=-175, _cos=-0.99622136, cos=-0.9961947072311165
angle=-174, _cos=-0.99456006, cos=-0.9945218917410721
angle=-173, _cos=-0.9925978, cos=-0.9925461594598222
angle=-172, _cos=-0.99033517, cos=-0.9902680582467471
angle=-171, _cos=-0.9877726, cos=-0.9876883442630557
angle=-170, _cos=-0.9849109, cos=-0.9848077328488366
angle=-169, _cos=-0.98175097, cos=-0.9816271801541483
angle=-168, _cos=-0.9782936, cos=-0.9781476176982725
angle=-167, _cos=-0.97453946, cos=-0.9743700517451377
angle=-166, _cos=-0.97049, cos=-0.9702957361674079
angle=-165, _cos=-0.966146, cos=-0.9659258007497356
angle=-164, _cos=-0.961509, cos=-0.9612616959876598
angle=-163, _cos=-0.9565799, cos=-0.9563047849178868
angle=-162, _cos=-0.9513603, cos=-0.9510565037710687
angle=-161, _cos=-0.9458515, cos=-0.9455185945886003
angle=-160, _cos=-0.94005513, cos=-0.939692593001358
angle=-159, _cos=-0.9339728, cos=-0.9335804328112187
angle=-158, _cos=-0.92760617, cos=-0.9271838981987857
angle=-157, _cos=-0.92095685, cos=-0.9205048444308557
angle=-156, _cos=-0.91402704, cos=-0.9135454884595733
angle=-155, _cos=-0.90681833, cos=-0.906307760074965
angle=-154, _cos=-0.89933294, cos=-0.8987940616678518
angle=-153, _cos=-0.89157283, cos=-0.8910064767442805
angle=-152, _cos=-0.8835404, cos=-0.8829475902067981
angle=-151, _cos=-0.87523764, cos=-0.8746197523266611
angle=-150, _cos=-0.86666703, cos=-0.8660253806059512
angle=-149, _cos=-0.85783106, cos=-0.8571673277407961
angle=-148, _cos=-0.8487321, cos=-0.8480480500191255
angle=-147, _cos=-0.839373, cos=-0.8386705743670589
angle=-146, _cos=-0.8297561, cos=-0.8290376344275047
angle=-145, _cos=-0.8198843, cos=-0.819152027702785
angle=-144, _cos=-0.8097606, cos=-0.809017035483602
angle=-143, _cos=-0.79938745, cos=-0.7986354681459424
angle=-142, _cos=-0.7887684, cos=-0.7880107716027712
angle=-141, _cos=-0.77790624, cos=-0.7771458920223127
angle=-140, _cos=-0.76680434, cos=-0.7660444357414705
angle=-139, _cos=-0.7554658, cos=-0.7547096375479136
angle=-138, _cos=-0.7438938, cos=-0.7431447905587066
angle=-137, _cos=-0.7320921, cos=-0.731353733448193
angle=-136, _cos=-0.7200638, cos=-0.7193397358097812
angle=-135, _cos=-0.707813, cos=-0.7071067854026294
angle=-134, _cos=-0.6953431, cos=-0.6946584458586323
angle=-133, _cos=-0.6826574, cos=-0.681998334651355
angle=-132, _cos=-0.6697606, cos=-0.6691306540019003
angle=-131, _cos=-0.65665585, cos=-0.6560589720452918
angle=-130, _cos=-0.64334756, cos=-0.6427876276136986
angle=-129, _cos=-0.6298397, cos=-0.6293203007758262
angle=-128, _cos=-0.6161365, cos=-0.6156614616886991
angle=-127, _cos=-0.602242, cos=-0.6018150882806468
angle=-126, _cos=-0.5881605, cos=-0.5877852053586913
angle=-125, _cos=-0.5738969, cos=-0.5735764698068935
angle=-124, _cos=-0.5594549, cos=-0.5591928216272118
angle=-123, _cos=-0.54483974, cos=-0.5446390351276227
angle=-122, _cos=-0.530056, cos=-0.5299193481811844
angle=-121, _cos=-0.51510775, cos=-0.5150380401317427
angle=-120, _cos=-0.50000066, cos=-0.5000000504735647
angle=-119, _cos=-0.48473898, cos=-0.48480954915607954
angle=-118, _cos=-0.46932822, cos=-0.469471578302864
angle=-117, _cos=-0.45377323, cos=-0.4539906034789449
angle=-116, _cos=-0.4380788, cos=-0.4383711259966142
angle=-115, _cos=-0.42225078, cos=-0.42261833036782626
angle=-114, _cos=-0.406294, cos=-0.40673669365676585
angle=-113, _cos=-0.39021397, cos=-0.39073116071970493
angle=-112, _cos=-0.37401626, cos=-0.3746066070083963
angle=-111, _cos=-0.35770637, cos=-0.35836794422955826
angle=-110, _cos=-0.34128994, cos=-0.34202011884871736
angle=-109, _cos=-0.32477286, cos=-0.32556811058346385
angle=-108, _cos=-0.3081606, cos=-0.30901704426134974
angle=-107, _cos=-0.2914592, cos=-0.2923717354199002
angle=-106, _cos=-0.27467465, cos=-0.27563736710785786
angle=-105, _cos=-0.25781316, cos=-0.25881903678780893
angle=-104, _cos=-0.24088049, cos=-0.2419218674980403
angle=-103, _cos=-0.22388309, cos=-0.22495100629200873
angle=-102, _cos=-0.20682737, cos=-0.20791173927477583
angle=-101, _cos=-0.1897194, cos=-0.19080902402599992
angle=-100, _cos=-0.17256577, cos=-0.173648186364537
angle=-99, _cos=-0.15537308, cos=-0.15643445365997144
angle=-98, _cos=-0.13814792, cos=-0.13917306939426774
angle=-97, _cos=-0.120896995, cos=-0.1218692915645513
angle=-96, _cos=-0.10362731, cos=-0.10452850963771676
angle=-95, _cos=-0.08634533, cos=-0.08715576891927246
angle=-94, _cos=-0.06905822, cos=-0.0697564796473987
angle=-93, _cos=-0.051773004, cos=-0.05233594182651971
angle=-92, _cos=-0.03449681, cos=-0.034899461933588664
angle=-91, _cos=-0.017236838, cos=-0.017452351301679672
angle=-90, _cos=-5.543232E-7, cos=-4.371139000186241E-8
angle=-89, _cos=0.017235914, cos=0.017452383083348
angle=-88, _cos=0.034495886, cos=0.03489949370073475
angle=-87, _cos=0.051771987, cos=0.05233597356946695
angle=-86, _cos=0.0690572, cos=0.06975651135647787
angle=-85, _cos=0.08634432, cos=0.08715580058482462
angle=-84, _cos=0.10362611, cos=0.10452842269384792
angle=-83, _cos=0.12089599, cos=0.12186932311412917
angle=-82, _cos=0.1381469, cos=0.13917310087143323
angle=-81, _cos=0.15537207, cos=0.1564344850551363
angle=-80, _cos=0.17256477, cos=0.1736482176681379
angle=-79, _cos=0.18971822, cos=0.19080893820942238
angle=-78, _cos=0.2068262, cos=0.20791165376239343
angle=-77, _cos=0.22388208, cos=0.22495103726383234
angle=-76, _cos=0.24087942, cos=0.24192189834035474
angle=-75, _cos=0.25781208, cos=0.25881906749121936
angle=-74, _cos=0.27467373, cos=0.2756373976630117
angle=-73, _cos=0.29145822, cos=0.29237165181707964
angle=-72, _cos=0.30815953, cos=0.3090169611173454
angle=-71, _cos=0.3247718, cos=0.3255681406381994
angle=-70, _cos=0.34128907, cos=0.3420201487182659
angle=-69, _cos=0.3577055, cos=0.3583679739048213
angle=-68, _cos=0.3740154, cos=0.37460663648033443
angle=-67, _cos=0.39021292, cos=0.39073108024661135
angle=-66, _cos=0.40629297, cos=0.4067366137920827
angle=-65, _cos=0.42224976, cos=0.42261825113588114
angle=-64, _cos=0.43807787, cos=0.43837115456613984
angle=-63, _cos=0.45377216, cos=0.4539905255846804
angle=-62, _cos=0.46932733, cos=0.4694716063686856
angle=-61, _cos=0.48473802, cos=0.48480957695718824
angle=-60, _cos=0.49999964, cos=0.499999974763217
angle=-59, _cos=0.5151069, cos=0.5150380673780998
angle=-58, _cos=0.5300549, cos=0.5299192740424647
angle=-57, _cos=0.5448388, cos=0.5446390117973712
angle=-56, _cos=0.559454, cos=0.5591928973939153
angle=-55, _cos=0.57389593, cos=0.5735764470196116
angle=-54, _cos=0.58815974, cos=0.5877852310745185
angle=-53, _cos=0.60224116, cos=0.6018150184617123
angle=-52, _cos=0.61613566, cos=0.6156614867368104
angle=-51, _cos=0.6298389, cos=0.6293203718000968
angle=-50, _cos=0.6433468, cos=0.6427876063037709
angle=-49, _cos=0.65665513, cos=0.6560590410190733
angle=-48, _cos=0.6697597, cos=0.6691305890341149
angle=-47, _cos=0.68265676, cos=0.6819983578985368
angle=-46, _cos=0.6953423, cos=0.6946583829719509
angle=-45, _cos=0.70781225, cos=0.7071067657322372
angle=-44, _cos=0.72006327, cos=0.7193397992954146
angle=-43, _cos=0.7320913, cos=0.731353714476271
angle=-42, _cos=0.7438932, cos=0.7431448118280339
angle=-41, _cos=0.7554651, cos=0.7547095801934123
angle=-40, _cos=0.7668037, cos=0.7660444561734449
angle=-39, _cos=0.77790564, cos=0.7771459495366342
angle=-38, _cos=0.78876776, cos=0.7880107544762174
angle=-37, _cos=0.7993869, cos=0.7986355231465139
angle=-36, _cos=0.8097599, cos=0.8090169840977831
angle=-35, _cos=0.81988376, cos=0.8191520459347782
angle=-34, _cos=0.8297555, cos=0.8290375855413114
angle=-33, _cos=0.83937234, cos=0.8386705592162165
angle=-32, _cos=0.8487317, cos=0.8480480984490619
angle=-31, _cos=0.8578306, cos=0.8571673134133982
angle=-30, _cos=0.8666665, cos=0.8660253964992068
angle=-29, _cos=0.87523717, cos=0.8746197099432601
angle=-28, _cos=0.88353986, cos=0.8829475911383176
angle=-27, _cos=0.8915725, cos=0.8910065182350011
angle=-26, _cos=0.8993324, cos=0.8987940494731845
angle=-25, _cos=0.90681785, cos=0.9063077861035319
angle=-24, _cos=0.9140266, cos=0.9135454529015278
angle=-23, _cos=0.92095655, cos=0.9205048568508346
angle=-22, _cos=0.92760575, cos=0.9271838542854957
angle=-21, _cos=0.9339724, cos=0.9335804228420908
angle=-20, _cos=0.94005483, cos=0.9396926242589767
angle=-19, _cos=0.94585115, cos=0.945518575829216
angle=-18, _cos=0.9513599, cos=0.9510565135936411
angle=-17, _cos=0.95657957, cos=0.9563047593579442
angle=-16, _cos=0.9615087, cos=0.9612616965345758
angle=-15, _cos=0.9661458, cos=0.9659258244035116
angle=-14, _cos=0.97048974, cos=0.9702957258326756
angle=-13, _cos=0.9745393, cos=0.974370065599612
angle=-12, _cos=0.97829324, cos=0.9781475995220578
angle=-11, _cos=0.9817507, cos=0.9816271833760248
angle=-10, _cos=0.9849108, cos=0.9848077538938695
angle=-9, _cos=0.98777246, cos=0.987688339911341
angle=-8, _cos=0.990335, cos=0.9902680688920995
angle=-7, _cos=0.9925977, cos=0.9925461515296595
angle=-6, _cos=0.99455994, cos=0.9945218950636677
angle=-5, _cos=0.9962212, cos=0.9961946983130029
angle=-4, _cos=0.9975811, cos=0.9975640502975485
angle=-3, _cos=0.99863917, cos=0.9986295346783179
angle=-2, _cos=0.99939513, cos=0.9993908270285325
angle=-1, _cos=0.9998488, cos=0.9998476951587508
angle=0, _cos=1.0, cos=1.0
angle=1, _cos=0.99984866, cos=0.9998476951587508
angle=2, _cos=0.999395, cos=0.9993908270285325
angle=3, _cos=0.9986391, cos=0.9986295346783179
angle=4, _cos=0.9975811, cos=0.9975640502975485
angle=5, _cos=0.9962212, cos=0.9961946983130029
angle=6, _cos=0.99455994, cos=0.9945218950636677
angle=7, _cos=0.9925977, cos=0.9925461515296595
angle=8, _cos=0.9903351, cos=0.9902680688920995
angle=9, _cos=0.98777246, cos=0.987688339911341
angle=10, _cos=0.9849108, cos=0.9848077538938695
angle=11, _cos=0.98175085, cos=0.9816271833760248
angle=12, _cos=0.97829324, cos=0.9781475995220578
angle=13, _cos=0.9745392, cos=0.974370065599612
angle=14, _cos=0.9704897, cos=0.9702957258326756
angle=15, _cos=0.9661458, cos=0.9659258244035116
angle=16, _cos=0.9615086, cos=0.9612616965345758
angle=17, _cos=0.9565796, cos=0.9563047593579442
angle=18, _cos=0.95136005, cos=0.9510565135936411
angle=19, _cos=0.94585115, cos=0.945518575829216
angle=20, _cos=0.9400548, cos=0.9396926242589767
angle=21, _cos=0.93397236, cos=0.9335804228420908
angle=22, _cos=0.9276058, cos=0.9271838542854957
angle=23, _cos=0.92095655, cos=0.9205048568508346
angle=24, _cos=0.91402656, cos=0.9135454529015278
angle=25, _cos=0.90681785, cos=0.9063077861035319
angle=26, _cos=0.8993324, cos=0.8987940494731845
angle=27, _cos=0.8915725, cos=0.8910065182350011
angle=28, _cos=0.88353986, cos=0.8829475911383176
angle=29, _cos=0.87523717, cos=0.8746197099432601
angle=30, _cos=0.86666656, cos=0.8660253964992068
angle=31, _cos=0.85783064, cos=0.8571673134133982
angle=32, _cos=0.8487317, cos=0.8480480984490619
angle=33, _cos=0.8393723, cos=0.8386705592162165
angle=34, _cos=0.82975554, cos=0.8290375855413114
angle=35, _cos=0.81988364, cos=0.8191520459347782
angle=36, _cos=0.8097599, cos=0.8090169840977831
angle=37, _cos=0.7993869, cos=0.7986355231465139
angle=38, _cos=0.78876776, cos=0.7880107544762174
angle=39, _cos=0.7779055, cos=0.7771459495366342
angle=40, _cos=0.7668037, cos=0.7660444561734449
angle=41, _cos=0.7554651, cos=0.7547095801934123
angle=42, _cos=0.7438931, cos=0.7431448118280339
angle=43, _cos=0.73209137, cos=0.731353714476271
angle=44, _cos=0.72006327, cos=0.7193397992954146
angle=45, _cos=0.7078122, cos=0.7071067657322372
angle=46, _cos=0.6953422, cos=0.6946583829719509
angle=47, _cos=0.6826567, cos=0.6819983578985368
angle=48, _cos=0.6697598, cos=0.6691305890341149
angle=49, _cos=0.6566552, cos=0.6560590410190733
angle=50, _cos=0.6433466, cos=0.6427876063037709
angle=51, _cos=0.62983906, cos=0.6293203718000968
angle=52, _cos=0.6161355, cos=0.6156614867368104
angle=53, _cos=0.60224116, cos=0.6018150184617123
angle=54, _cos=0.5881598, cos=0.5877852310745185
angle=55, _cos=0.573896, cos=0.5735764470196116
angle=56, _cos=0.559454, cos=0.5591928973939153
angle=57, _cos=0.5448389, cos=0.5446390117973712
angle=58, _cos=0.53005487, cos=0.5299192740424647
angle=59, _cos=0.515107, cos=0.5150380673780998
angle=60, _cos=0.49999952, cos=0.499999974763217
angle=61, _cos=0.48473817, cos=0.48480957695718824
angle=62, _cos=0.4693274, cos=0.4694716063686856
angle=63, _cos=0.453772, cos=0.4539905255846804
angle=64, _cos=0.43807787, cos=0.43837115456613984
angle=65, _cos=0.42224976, cos=0.42261825113588114
angle=66, _cos=0.40629297, cos=0.4067366137920827
angle=67, _cos=0.3902129, cos=0.39073108024661135
angle=68, _cos=0.37401545, cos=0.37460663648033443
angle=69, _cos=0.35770553, cos=0.3583679739048213
angle=70, _cos=0.34128898, cos=0.3420201487182659
angle=71, _cos=0.32477176, cos=0.3255681406381994
angle=72, _cos=0.30815944, cos=0.3090169611173454
angle=73, _cos=0.29145816, cos=0.29237165181707964
angle=74, _cos=0.27467382, cos=0.2756373976630117
angle=75, _cos=0.25781208, cos=0.25881906749121936
angle=76, _cos=0.2408795, cos=0.24192189834035474
angle=77, _cos=0.22388208, cos=0.22495103726383234
angle=78, _cos=0.2068261, cos=0.20791165376239343
angle=79, _cos=0.18971837, cos=0.19080893820942238
angle=80, _cos=0.17256494, cos=0.1736482176681379
angle=81, _cos=0.15537193, cos=0.1564344850551363
angle=82, _cos=0.138147, cos=0.13917310087143323
angle=83, _cos=0.12089583, cos=0.12186932311412917
angle=84, _cos=0.10362623, cos=0.10452842269384792
angle=85, _cos=0.08634446, cos=0.08715580058482462
angle=86, _cos=0.069057085, cos=0.06975651135647787
angle=87, _cos=0.05177213, cos=0.05233597356946695
angle=88, _cos=0.034495924, cos=0.03489949370073475
angle=89, _cos=0.017235871, cos=0.017452383083348
angle=90, _cos=-7.390978E-7, cos=-4.371139000186241E-8
angle=91, _cos=-0.01723662, cos=-0.017452351301679672
angle=92, _cos=-0.03449687, cos=-0.034899461933588664
angle=93, _cos=-0.05177328, cos=-0.05233594182651971
angle=94, _cos=-0.06905825, cos=-0.0697564796473987
angle=95, _cos=-0.08634505, cos=-0.08715576891927246
angle=96, _cos=-0.10362723, cos=-0.10452850963771676
angle=97, _cos=-0.12089703, cos=-0.1218692915645513
angle=98, _cos=-0.1381478, cos=-0.13917306939426774
angle=99, _cos=-0.15537316, cos=-0.15643445365997144
angle=100, _cos=-0.17256598, cos=-0.173648186364537
angle=101, _cos=-0.18971942, cos=-0.19080902402599992
angle=102, _cos=-0.20682715, cos=-0.20791173927477583
angle=103, _cos=-0.22388336, cos=-0.22495100629200873
angle=104, _cos=-0.24088056, cos=-0.2419218674980403
angle=105, _cos=-0.25781295, cos=-0.25881903678780893
angle=106, _cos=-0.27467492, cos=-0.27563736710785786
angle=107, _cos=-0.29145926, cos=-0.2923717354199002
angle=108, _cos=-0.30816033, cos=-0.30901704426134974
angle=109, _cos=-0.3247729, cos=-0.32556811058346385
angle=110, _cos=-0.34128988, cos=-0.34202011884871736
angle=111, _cos=-0.3577062, cos=-0.35836794422955826
angle=112, _cos=-0.37401637, cos=-0.3746066070083963
angle=113, _cos=-0.3902143, cos=-0.39073116071970493
angle=114, _cos=-0.4062939, cos=-0.40673669365676585
angle=115, _cos=-0.4222507, cos=-0.42261833036782626
angle=116, _cos=-0.43807906, cos=-0.4383711259966142
angle=117, _cos=-0.45377344, cos=-0.4539906034789449
angle=118, _cos=-0.46932814, cos=-0.469471578302864
angle=119, _cos=-0.48473912, cos=-0.48480954915607954
angle=120, _cos=-0.5000008, cos=-0.5000000504735647
angle=121, _cos=-0.5151077, cos=-0.5150380401317427
angle=122, _cos=-0.5300558, cos=-0.5299193481811844
angle=123, _cos=-0.54483986, cos=-0.5446390351276227
angle=124, _cos=-0.5594548, cos=-0.5591928216272118
angle=125, _cos=-0.57389677, cos=-0.5735764698068935
angle=126, _cos=-0.5881606, cos=-0.5877852053586913
angle=127, _cos=-0.60224193, cos=-0.6018150882806468
angle=128, _cos=-0.61613625, cos=-0.6156614616886991
angle=129, _cos=-0.62983984, cos=-0.6293203007758262
angle=130, _cos=-0.6433476, cos=-0.6427876276136986
angle=131, _cos=-0.6566557, cos=-0.6560589720452918
angle=132, _cos=-0.66976064, cos=-0.6691306540019003
angle=133, _cos=-0.68265754, cos=-0.681998334651355
angle=134, _cos=-0.695343, cos=-0.6946584458586323
angle=135, _cos=-0.707813, cos=-0.7071067854026294
angle=136, _cos=-0.7200638, cos=-0.7193397358097812
angle=137, _cos=-0.7320922, cos=-0.731353733448193
angle=138, _cos=-0.7438939, cos=-0.7431447905587066
angle=139, _cos=-0.75546587, cos=-0.7547096375479136
angle=140, _cos=-0.7668042, cos=-0.7660444357414705
angle=141, _cos=-0.7779061, cos=-0.7771458920223127
angle=142, _cos=-0.7887686, cos=-0.7880107716027712
angle=143, _cos=-0.79938745, cos=-0.7986354681459424
angle=144, _cos=-0.8097606, cos=-0.809017035483602
angle=145, _cos=-0.8198843, cos=-0.819152027702785
angle=146, _cos=-0.82975614, cos=-0.8290376344275047
angle=147, _cos=-0.839373, cos=-0.8386705743670589
angle=148, _cos=-0.8487321, cos=-0.8480480500191255
angle=149, _cos=-0.8578312, cos=-0.8571673277407961
angle=150, _cos=-0.86666715, cos=-0.8660253806059512
angle=151, _cos=-0.8752375, cos=-0.8746197523266611
angle=152, _cos=-0.8835404, cos=-0.8829475902067981
angle=153, _cos=-0.89157283, cos=-0.8910064767442805
angle=154, _cos=-0.8993329, cos=-0.8987940616678518
angle=155, _cos=-0.9068184, cos=-0.906307760074965
angle=156, _cos=-0.91402715, cos=-0.9135454884595733
angle=157, _cos=-0.9209568, cos=-0.9205048444308557
angle=158, _cos=-0.9276061, cos=-0.9271838981987857
angle=159, _cos=-0.9339729, cos=-0.9335804328112187
angle=160, _cos=-0.940055, cos=-0.939692593001358
angle=161, _cos=-0.94585145, cos=-0.9455185945886003
angle=162, _cos=-0.95136034, cos=-0.9510565037710687
angle=163, _cos=-0.9565799, cos=-0.9563047849178868
angle=164, _cos=-0.9615089, cos=-0.9612616959876598
angle=165, _cos=-0.9661461, cos=-0.9659258007497356
angle=166, _cos=-0.97049, cos=-0.9702957361674079
angle=167, _cos=-0.97453946, cos=-0.9743700517451377
angle=168, _cos=-0.9782936, cos=-0.9781476176982725
angle=169, _cos=-0.98175097, cos=-0.9816271801541483
angle=170, _cos=-0.9849109, cos=-0.9848077328488366
angle=171, _cos=-0.9877726, cos=-0.9876883442630557
angle=172, _cos=-0.9903352, cos=-0.9902680582467471
angle=173, _cos=-0.9925978, cos=-0.9925461594598222
angle=174, _cos=-0.99456006, cos=-0.9945218917410721
angle=175, _cos=-0.99622136, cos=-0.9961947072311165
angle=176, _cos=-0.9975811, cos=-0.9975640506788648
angle=177, _cos=-0.9986393, cos=-0.9986295298952702
angle=178, _cos=-0.9993952, cos=-0.9993908286494242
angle=179, _cos=-0.99984884, cos=-0.9998476942464143
angle=180, _cos=-1.0, cos=-0.9999999999999962
Gene
mahowik:

корректно работает только в диапазоне -180…180, т.е. надо приводить к этому диапазону…

каюсь. я специально вырезал приведение к диапазону, ибо для моих задач (подвес) они не нужны… Ибо если подвес, а с ним и коптер, вышел из диапазона -180…180, задача стабилизации – как бы это помягче сказать – отходит на второй план 😃

mahowik:

надо будет еще на ардуине прогнать и посмотреть выигрышь в производительности… если хотябы в 2-3 раза, то уже можно будет и матрицы крутить на AVR-ке с частотой 150-200гц…

Александр, расскажите пожалуйста здесь о результатах теста, у меня никах руки не доходят…

mahowik
Gene:

расскажите пожалуйста здесь о результатах теста, у меня никах руки не доходят…

обещаю! 😉

p.s. меня все не покидает идея улучшения качества удержания позиции по гпс с применением акселя 😃, где аксель будет основноый и быстрый сенсор, а гпс лишь корректор…
на AVR-ке конечно же, т.е. на AIOP… и там как раз нужны быстрые sin/cos, чеб привести вектор акселя в глобальную систему координат, т.е. в которой живет гпс…

SergDoc
mahowik:

angle=90, _cos=-7.390978E-7, cos=-4.371139000186241E-8

Саш, чёт с математикой не слишком срослось? я конечно понимаю что нулей впереди до дури но всёже?

mahowik
SergDoc:

чёт с математикой не слишком срослось? я конечно понимаю что нулей впереди до дури но всёже?

mahowik:

для косинуса картинка еще лучше… практически стабильные 3 знака после запятой…

т.е. с точностью до 3-х знаков и там и там ноль ))

  • надо учесть, что еще на входе погрешность, где угол в радианы переводится… т.е. (float)(i*Math.PI/180.0f)
SergDoc

а я как всегда со своей колокольни 😃 ±0 напрягает, можно невзначай и через 180 повернуть? 😃

mahowik
Gene:

Но вообще мне и сейчас кажется, что спокойнее все же посчитать константы самому

глянул… в свежей версии так и сделали…

int16_t _atan2(int32_t y, int32_t x){
  float z = (float)y / x;
  int16_t a;
  if ( abs(y) < abs(x) ){
     a = 573 * z / (1.0f + 0.28f * z * z);
   if (x<0) {
     if (y<0) a -= 1800;
     else a += 1800;
   }
  } else {
   a = 900 - 573 * z / (z * z + 0.28f);
   if (y<0) a -= 1800;
  }
  return a;
}

вот еще в ardu нашел… самый быстрый sin/cos и сразу с углом на входе…

static const uint16_t     pgm_sinLUT[91] PROGMEM = {0, 17, 35, 52, 70, 87, 105, 122, 139, 156, 174, 191, 208, 225, 242, 259, 276, 292, 309, 326, 342, 358, 375, 391, 407, 423, 438, 454, 469, 485, 500, 515, 530, 545, 559, 574, 588, 602, 616, 629, 643, 656, 669, 682, 695, 707, 719, 731, 743, 755, 766, 777, 788, 799, 809, 819, 829, 839, 848, 857, 866, 875, 883, 891, 899, 906, 914, 921, 927, 934, 940, 946, 951, 956, 961, 966, 970, 974, 978, 982, 985, 988, 990, 993, 995, 996, 998, 999, 999, 1000, 1000};

float
Trig_LUT::sin_lut(int16_t angle)
{
    int8_t m,n;
    int16_t _sin;

    if (angle < 0){
        m         = -1;
        angle     = -angle;
    }else{
        m         = 1;
    }

    // 0 - 360 only
    angle %= 360;

    // check quadrant
    if (angle <= 90){
        n = 1; // first quadrant
    } else if ((angle > 90) && (angle <= 180)) {
        angle = 180 - angle;
        n = 1;    // second quadrant
    } else if ((angle > 180) && (angle <= 270)) {
        angle = angle - 180;
        n = -1; // third quadrant
    } else {
        angle = 360 - angle;
        n = -1;
    }         // fourth quadrant

    // get lookup value
    _sin = pgm_read_word(&pgm_sinLUT[angle]);

    // calculate sinus value
    return (float)(_sin * m * n) / 1000;
}

float
Trig_LUT::cos_lut(int16_t angle)
{
    return (sin_lut(90 - angle));
}
mahowik
mahowik:

обещаю!

Написал сегодня тестик. Подрюкался с загадками компиллятора 😃
Если sin/cos считать в цикле и результат функции не присваивать, либо присваивать, но не использовать вне тела цикла, то компиллер считает что “а нах. тогда функцию вообще вызывать” )) Пришлось в цикле контрольную сумму считать…

Результаты:

  1. _sin() быстрее библиотечного sin() на 84%

  2. _cos() быстрее библ. cos() всего на 23%

  3. sin_lut() быстрее библ. sin() на 96%

  4. cos_lut() быстрее библ. cos() на 88%

Таким образом, если точность угла на входе с дискретностью в 1-цу устраивает (а также точность результата три знака после запятой), то табличный sin/cos имеет смысл…

Код теста:

void setup() {
  Serial.begin(115200);
  Serial.println("Start performance test:");
}

static float rad[181];

void loop() {
  uint32_t totalTimeOrig = 0, totalTimeApprox = 0;
  float summ = 0.0f;

  // prepare input data in radians
  for (int i = 0; i <= 180; i++) {
    rad[i] = i*PI/180.0f;
  }

  uint32_t currentTime = micros();
  for (int k = 0; k < 100; k++) {
    for (int i = 0; i <= 180; i++) {
      summ += sin(rad[i]);
      summ += sin(-rad[i]);
    }
  }
  totalTimeOrig = micros() - currentTime;
  Serial.println(summ);

  currentTime = micros();
  for (int k = 0; k < 100; k++) {
    /*for (int i = 0; i <= 180; i++) {
      summ += sin_lut(i);
      summ += sin_lut(-i);
    }*/
    for (int i = 0; i <= 180; i++) {
      summ += _sin(rad[i]);
      summ += _sin(-rad[i]);
    }
  }
  totalTimeApprox = micros() - currentTime;
  Serial.println(summ);

  Serial.print("totalTimeOrig = ");
  Serial.println(totalTimeOrig);
  Serial.print("totalTimeApprox = ");
  Serial.println(totalTimeApprox);
  Serial.print("performance = ");
  Serial.println((float)totalTimeOrig/totalTimeApprox);
  Serial.println();

  delay(2000);
}

float _sin (float x) {
  x = x * 0.31831f;
  float y = x - x * abs(x);
  return y * (3.1f + 3.6f * abs(y));
}

float _cos (float x) {
  x = x * 0.31831f + 0.5f;
  float z = (x + 25165824.0f);
  x = x - (z - 25165824.0f);
  float y = x - x * abs(x);
  return y * (3.1f + 3.6f * abs(y));
}


float _atan( float x )
{
  uint32_t ux_s  = 0x80000000 & (uint32_t &)x;
  float bx_a = ::fabs( 0.596227f * x );
  float num = bx_a + x * x;
  float atan_1q = num / ( 1.f + bx_a + num );
  uint32_t atan_2q = ux_s | (uint32_t &)atan_1q;
  return (float &)atan_2q * 1.5708f;
}


float isqrt( float y )
{
  float x2 = y * 0.5f;
  long i = * ( long * ) &y;    //evil floating point bit level hacking
  i = 0x5f3759df - ( i >> 1 ); //what the fuck?
  y = * ( float * ) &i;
  y = y * ( 1.5f - ( x2 * y * y ) );
  return y;
}

static const uint16_t 	pgm_sinLUT[91] PROGMEM = {
  0, 17, 35, 52, 70, 87, 105, 122, 139, 156, 174, 191, 208, 225, 242, 259, 276, 292, 309, 326, 342, 358, 375, 391, 407, 423, 438, 454, 469, 485, 500, 515, 530, 545, 559, 574, 588, 602, 616, 629, 643, 656, 669, 682, 695, 707, 719, 731, 743, 755, 766, 777, 788, 799, 809, 819, 829, 839, 848, 857, 866, 875, 883, 891, 899, 906, 914, 921, 927, 934, 940, 946, 951, 956, 961, 966, 970, 974, 978, 982, 985, 988, 990, 993, 995, 996, 998, 999, 999, 1000, 1000};

float sin_lut(int16_t angle) {
  int8_t m,n;
  int16_t _sin;

  if (angle < 0){
    m = -1;
    angle = -angle;
  } else{
    m = 1;
  }

  // 0 - 360 only
  angle %= 360;

  // check quadrant
  if (angle <= 90) {
    n = 1; // first quadrant
  }
  else if ((angle > 90) && (angle <= 180)) {
    angle = 180 - angle;
    n = 1;	// second quadrant
  }
  else if ((angle > 180) && (angle <= 270)) {
    angle = angle - 180;
    n = -1; // third quadrant
  }
  else {
    angle = 360 - angle;
    n = -1;
  }		 // fourth quadrant

  // get lookup value
  _sin = pgm_read_word(&pgm_sinLUT[angle]);

  // calculate sinus value
  return (float)(_sin * m * n) / 1000;
}

float cos_lut(int16_t angle) {
  return (sin_lut(90 - angle));
}
Gene

Спасибо, Александр! Очень интересно. Но вот вопросик, ежели надо на входе угол в радианах (конечно и с плавающей точкой), не убьет ли конверсия все преимущество sin_lut по скорости? Я вот так навскидку не вижу, как можно без потерь адаптировать…

А насчет “медленного” _cos – это очевидно сказывается приведение к диапазону, float z = (x + 25165824.0f);
x = x - (z - 25165824.0f); потому что в остальном это тот же _sin со сдвигом.

7 days later
mahowik

Надоел мне совсем ардуиновский IDE для разработки, хотя по сути пользовал его только для компилинга, а писал в Notepad++
Вчера попробовал CodeBlocks-Arduino, может он и ничего, но не смог настроить проект…
Далее глянул MariaMole тоже не понравилась…
Потом решил поставить Visual Studio + Visual Micro pluggin.
Оказалось то что надо! Навигатор удобный как по файлам так и по функциям/перменным, code completion, подсветка синтаксиса с “приглушенным” контентом, если дефайн закрыт… Из минусов Visual Studio запросил гад 5 гб на С диске, также он триальный на 90 дней, НО разработчики Visual Micro пишут что через 90 дней будет доступен Atmel/Visual Studio

Собственно вопрос. Кто на чем пишет под arduino?

mataor
mahowik:

Собственно вопрос. Кто на чем пишет под arduino?

имхо… ардуино ИДЕ - убожество, да и многие другие, по сравнению с атмел студио.
при необходимости достаточно посидеть несколько часов над основными библиотеками ардуино и перетащить их на студию для удобства.

Sir_Alex
mahowik:

Кто на чем пишет под arduino?

UltraEdit )))

На днях прикрутили проект пирата к Eclipse… но по факту получилось только компиляция. Ошибки он не подсвечивает (точнее у него ошибка практически в каждой строке)

mahowik
mataor:

имхо… ардуино ИДЕ - убожество, да и многие другие, по сравнению с атмел студио.
при необходимости достаточно посидеть несколько часов над основными библиотеками ардуино и перетащить их на студию для удобства.

в том и дело Visual Studio + Visual Micro pluggin работает почти из коробки и ниче перетаскивать не надо… показал ей где ардуино фолдэр, открыл главный ino файл и готово!

SergDoc
Sir_Alex:

На днях прикрутили проект пирата к Eclipse…

а можно поподробней? я пытаюсь сейчас AutoQuad32 перетянуть - пока безуспешно (*.ino в *.срр интересно можно просто переименовать, а то гцц может и не понять что за фигня - далее знаю где подключается, так что изменить не проблема), с моими кривыми ручками это надолго - ибо переписываю makefile…

mataor
SergDoc:

*.ino в *.срр

попробуйте основной файл в .cpp а прочие в .h + придется разбиратся с переменными. По крайней мере в атмел студии я именно так и поступал.

SergDoc

у меня он единственный, сейчас компилятор наконец-то увидел (странно патчи прописывал как и раньше, а не пошло- пришлось ближе передвигать - …/…/ ), но ругается что правил для сборки нет, вот и думаю как безболезненно makefile переписать…