fixed.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #include <fixed.h>
  2. char* fixtostr (fix f, char* string) {
  3. int n;
  4. int i;
  5. int cpt;
  6. int start = 0;
  7. n = UNFIX(f);
  8. if (n<0) {
  9. start=1;
  10. string[0] = '-';
  11. n *= -1;
  12. }
  13. for (i = 1, cpt = 1; n / i >= 10; i *= 10, cpt++);
  14. for (cpt = start; i; cpt++, i /= 10) string[cpt] = (n / i) % 10 + '0';
  15. string[cpt] = '\0';
  16. return string;
  17. }
  18. fix ftofix(float f) {
  19. return f*(1<<DB);
  20. }
  21. float fixtof(fix f) {
  22. return ((float)f)/(1<<DB);
  23. }
  24. fix fdiv(fix x, fix y) {
  25. if (y>(1<<(2*DB-2))) return x/(y>>DB);
  26. return fmul(x, ((1<<(2*DB))/y));
  27. // return mult(x, (0x40000000/y)>>(30-2*precision));
  28. }
  29. fix fmul(fix x, fix y) {
  30. int d1, d2, e1, e2;
  31. e1 = x >> DB;
  32. e2 = y >> DB;
  33. d1 = x & (0xFFFFFFFF>>(32-DB));
  34. d2 = y & (0xFFFFFFFF>>(32-DB));
  35. return ((e1*e2)<<DB) + e1*d2 + e2*d1 + ((d1*d2)>>DB);
  36. }
  37. // Precomputed table of sinus value, between 0 and 90° inclued with step of 0.1°.
  38. // Values are in fixed 30 bits of decimal.
  39. int precalc_sin[901] = {
  40. 0, 1874032, 3748058, 5622073, 7496071, 9370046, 11243993,
  41. 13117905, 14991777, 16865604, 18739378, 20613096, 22486752, 24360338,
  42. 26233852, 28107284, 29980632, 31853888, 33727044, 35600100, 37473048,
  43. 39345884, 41218596, 43091184, 44963640, 46835960, 48708136, 50580168,
  44. 52452040, 54323756, 56195304, 58066684, 59937884, 61808904, 63679732,
  45. 65550372, 67420808, 69291040, 71161056, 73030864, 74900440, 76769800,
  46. 78638912, 80507792, 82376432, 84244816, 86112936, 87980800, 89848400,
  47. 91715720, 93582768, 95449528, 97315992, 99182160, 101048032, 102913592,
  48. 104778840, 106643768, 108508376, 110372648, 112236584, 114100176, 115963424,
  49. 117826320, 119688856, 121551024, 123412824, 125274248, 127135296, 128995952,
  50. 130856208, 132716072, 134575536, 136434592, 138293216, 140151424, 142009216,
  51. 143866576, 145723488, 147579952, 149435984, 151291552, 153146656, 155001296,
  52. 156855456, 158709152, 160562352, 162415072, 164267296, 166119008, 167970224,
  53. 169820928, 171671120, 173520784, 175369920, 177218512, 179066576, 180914096,
  54. 182761056, 184607472, 186453312, 188298592, 190143296, 191987424, 193830960,
  55. 195673904, 197516256, 199358016, 201199152, 203039680, 204879600, 206718880,
  56. 208557552, 210395568, 212232960, 214069696, 215905776, 217741200, 219575968,
  57. 221410064, 223243472, 225076224, 226908272, 228739632, 230570304, 232400272,
  58. 234229520, 236058064, 237885888, 239712992, 241539360, 243364992, 245189872,
  59. 247014032, 248837424, 250660048, 252481920, 254303024, 256123344, 257942896,
  60. 259761664, 261579632, 263396800, 265213168, 267028736, 268843488, 270657408,
  61. 272470528, 274282784, 276094240, 277904832, 279714592, 281523488, 283331520,
  62. 285138720, 286945024, 288750464, 290555008, 292358688, 294161472, 295963360,
  63. 297764352, 299564416, 301363584, 303161824, 304959168, 306755552, 308551008,
  64. 310345536, 312139104, 313931712, 315723392, 317514112, 319303840, 321092608,
  65. 322880384, 324667200, 326453024, 328237824, 330021664, 331804480, 333586272,
  66. 335367072, 337146848, 338925568, 340703296, 342479936, 344255584, 346030144,
  67. 347803680, 349576160, 351347552, 353117888, 354887136, 356655296, 358422400,
  68. 360188384, 361953280, 363717088, 365479744, 367241344, 369001792, 370761120,
  69. 372519328, 374276384, 376032320, 377787104, 379540736, 381293184, 383044512,
  70. 384794656, 386543616, 388291424, 390038048, 391783456, 393527680, 395270720,
  71. 397012544, 398753184, 400492576, 402230752, 403967712, 405703456, 407437952,
  72. 409171200, 410903200, 412633952, 414363456, 416091680, 417818656, 419544352,
  73. 421268768, 422991904, 424713760, 426434304, 428153568, 429871488, 431588128,
  74. 433303456, 435017472, 436730144, 438441504, 440151520, 441860192, 443567488,
  75. 445273472, 446978112, 448681344, 450383232, 452083776, 453782912, 455480672,
  76. 457177024, 458872000, 460565600, 462257760, 463948544, 465637888, 467325824,
  77. 469012352, 470697440, 472381088, 474063296, 475744064, 477423392, 479101248,
  78. 480777664, 482452608, 484126080, 485798080, 487468576, 489137632, 490805152,
  79. 492471200, 494135744, 495798784, 497460320, 499120352, 500778848, 502435808,
  80. 504091264, 505745152, 507397536, 509048352, 510697600, 512345312, 513991456,
  81. 515636064, 517279072, 518920512, 520560352, 522198624, 523835328, 525470400,
  82. 527103904, 528735776, 530366048, 531994688, 533621728, 535247136, 536870912,
  83. 538493056, 540113536, 541732416, 543349632, 544965184, 546579072, 548191296,
  84. 549801856, 551410752, 553017920, 554623424, 556227264, 557829376, 559429824,
  85. 561028544, 562625600, 564220864, 565814464, 567406336, 568996480, 570584896,
  86. 572171520, 573756480, 575339648, 576921088, 578500736, 580078656, 581654784,
  87. 583229120, 584801728, 586372544, 587941504, 589508736, 591074176, 592637824,
  88. 594199680, 595759680, 597317888, 598874240, 600428800, 601981568, 603532416,
  89. 605081472, 606628672, 608174080, 609717568, 611259264, 612799040, 614336960,
  90. 615873024, 617407168, 618939456, 620469888, 621998400, 623525056, 625049792,
  91. 626572608, 628093504, 629612544, 631129600, 632644800, 634158016, 635669312,
  92. 637178688, 638686080, 640191616, 641695104, 643196672, 644696320, 646193984,
  93. 647689664, 649183360, 650675072, 652164864, 653652608, 655138368, 656622144,
  94. 658103936, 659583680, 661061504, 662537216, 664010944, 665482688, 666952320,
  95. 668420032, 669885632, 671349184, 672810688, 674270208, 675727616, 677182976,
  96. 678636288, 680087552, 681536704, 682983808, 684428800, 685871744, 687312576,
  97. 688751296, 690187968, 691622464, 693054912, 694485248, 695913472, 697339520,
  98. 698763520, 700185344, 701605056, 703022592, 704438016, 705851264, 707262400,
  99. 708671424, 710078208, 711482880, 712885312, 714285632, 715683776, 717079744,
  100. 718473536, 719865088, 721254464, 722641664, 724026688, 725409472, 726790016,
  101. 728168384, 729544576, 730918464, 732290176, 733659648, 735026880, 736391872,
  102. 737754624, 739115072, 740473344, 741829312, 743183104, 744534528, 745883776,
  103. 747230656, 748575360, 749917696, 751257792, 752595584, 753931072, 755264320,
  104. 756595200, 757923840, 759250112, 760574080, 761895808, 763215104, 764532160,
  105. 765846848, 767159168, 768469248, 769776896, 771082240, 772385216, 773685888,
  106. 774984128, 776280064, 777573632, 778864832, 780153600, 781440064, 782724096,
  107. 784005760, 785285056, 786561920, 787836416, 789108544, 790378240, 791645504,
  108. 792910400, 794172864, 795432896, 796690496, 797945664, 799198464, 800448768,
  109. 801696640, 802942080, 804185088, 805425600, 806663744, 807899328, 809132544,
  110. 810363264, 811591488, 812817280, 814040576, 815261376, 816479680, 817695552,
  111. 818908864, 820119744, 821328128, 822533952, 823737280, 824938176, 826136512,
  112. 827332288, 828525568, 829716352, 830904576, 832090304, 833273472, 834454144,
  113. 835632192, 836807744, 837980800, 839151232, 840319104, 841484416, 842647232,
  114. 843807424, 844965056, 846120128, 847272576, 848422464, 849569792, 850714496,
  115. 851856640, 852996224, 854133120, 855267456, 856399232, 857528320, 858654848,
  116. 859778752, 860900032, 862018688, 863134720, 864248128, 865358912, 866467008,
  117. 867572544, 868675392, 869775616, 870873152, 871968064, 873060288, 874149888,
  118. 875236800, 876321088, 877402624, 878481600, 879557824, 880631360, 881702272,
  119. 882770432, 883835968, 884898752, 885958848, 887016320, 888070976, 889123008,
  120. 890172288, 891218880, 892262784, 893303936, 894342400, 895378112, 896411072,
  121. 897441344, 898468864, 899493632, 900515648, 901534976, 902551488, 903565312,
  122. 904576384, 905584640, 906590208, 907592960, 908593024, 909590208, 910584704,
  123. 911576384, 912565312, 913551488, 914534848, 915515392, 916493184, 917468160,
  124. 918440384, 919409792, 920376384, 921340160, 922301184, 923259328, 924214720,
  125. 925167296, 926116992, 927063936, 928008000, 928949248, 929887680, 930823296,
  126. 931756032, 932686016, 933613056, 934537344, 935458688, 936377280, 937292928,
  127. 938205760, 939115776, 940022848, 940927104, 941828544, 942727040, 943622720,
  128. 944515456, 945405376, 946292352, 947176512, 948057728, 948936128, 949811584,
  129. 950684160, 951553856, 952420608, 953284480, 954145472, 955003584, 955858752,
  130. 956710976, 957560320, 958406720, 959250240, 960090816, 960928448, 961763200,
  131. 962594944, 963423808, 964249792, 965072768, 965892800, 966709888, 967524096,
  132. 968335296, 969143552, 969948864, 970751232, 971550656, 972347072, 973140608,
  133. 973931072, 974718656, 975503232, 976284864, 977063488, 977839104, 978611840,
  134. 979381504, 980148224, 980911936, 981672704, 982430464, 983185216, 983936960,
  135. 984685760, 985431552, 986174272, 986914048, 987650816, 988384576, 989115328,
  136. 989843008, 990567744, 991289408, 992008064, 992723776, 993436352, 994145984,
  137. 994852544, 995556096, 996256576, 996954048, 997648512, 998339904, 999028288,
  138. 999713600, 1000395840, 1001075072, 1001751232, 1002424320, 1003094400, 1003761408,
  139. 1004425408, 1005086272, 1005744128, 1006398848, 1007050560, 1007699200, 1008344768,
  140. 1008987264, 1009626688, 1010263040, 1010896320, 1011526464, 1012153600, 1012777600,
  141. 1013398528, 1014016384, 1014631168, 1015242816, 1015851392, 1016456896, 1017059264,
  142. 1017658560, 1018254784, 1018847872, 1019437824, 1020024704, 1020608512, 1021189184,
  143. 1021766720, 1022341120, 1022912448, 1023480704, 1024045760, 1024607744, 1025166592,
  144. 1025722304, 1026274944, 1026824384, 1027370752, 1027913984, 1028454080, 1028991040,
  145. 1029524864, 1030055552, 1030583104, 1031107520, 1031628736, 1032146880, 1032661888,
  146. 1033173696, 1033682368, 1034187904, 1034690304, 1035189568, 1035685632, 1036178560,
  147. 1036668352, 1037154944, 1037638400, 1038118720, 1038595840, 1039069824, 1039540608,
  148. 1040008256, 1040472704, 1040934016, 1041392128, 1041847104, 1042298880, 1042747520,
  149. 1043192896, 1043635200, 1044074240, 1044510144, 1044942848, 1045372416, 1045798720,
  150. 1046221888, 1046641856, 1047058624, 1047472256, 1047882624, 1048289856, 1048693888,
  151. 1049094720, 1049492352, 1049886784, 1050278016, 1050666048, 1051050880, 1051432512,
  152. 1051810944, 1052186112, 1052558144, 1052926976, 1053292608, 1053654976, 1054014144,
  153. 1054370112, 1054722880, 1055072448, 1055418816, 1055761920, 1056101824, 1056438528,
  154. 1056771968, 1057102272, 1057429248, 1057753088, 1058073664, 1058391040, 1058705152,
  155. 1059016128, 1059323776, 1059628288, 1059929472, 1060227520, 1060522304, 1060813824,
  156. 1061102144, 1061387200, 1061669056, 1061947712, 1062223104, 1062495232, 1062764160,
  157. 1063029824, 1063292224, 1063551424, 1063807424, 1064060096, 1064309568, 1064555840,
  158. 1064798784, 1065038528, 1065275072, 1065508288, 1065738304, 1065965056, 1066188608,
  159. 1066408896, 1066625856, 1066839680, 1067050176, 1067257472, 1067461440, 1067662208,
  160. 1067859776, 1068054016, 1068245056, 1068432768, 1068617280, 1068798528, 1068976512,
  161. 1069151232, 1069322752, 1069490944, 1069655936, 1069817600, 1069976064, 1070131264,
  162. 1070283200, 1070431808, 1070577216, 1070719360, 1070858240, 1070993856, 1071126272,
  163. 1071255360, 1071381184, 1071503744, 1071623040, 1071739072, 1071851840, 1071961344,
  164. 1072067584, 1072170560, 1072270272, 1072366720, 1072459904, 1072549824, 1072636480,
  165. 1072719872, 1072800000, 1072876800, 1072950400, 1073020672, 1073087744, 1073151488,
  166. 1073211968, 1073269248, 1073323200, 1073373888, 1073421312, 1073465472, 1073506304,
  167. 1073543936, 1073578304, 1073609344, 1073637184, 1073661696, 1073682944, 1073700928,
  168. 1073715648, 1073727104, 1073735296, 1073740160, 1073741824 };
  169. fix fsin(fix a) {
  170. int v;
  171. if(a<0) v = 3600+UNFIX(a*10)%3600;
  172. else v = UNFIX(a*10)%3600;
  173. if (v<=900) return precalc_sin[v]>>(30-DB);
  174. if (v<=1800) return precalc_sin[1800-v]>>(30-DB);
  175. if (v<=2700) return -(precalc_sin[v-1800]>>(30-DB));
  176. return -(precalc_sin[3600-v]>>(30-DB));
  177. }
  178. fix fcos(fix a) {
  179. return fsin(FIX(90)-a);
  180. }
  181. fix ftan(fix a) {
  182. return fdiv(fsin(a), fcos(a));
  183. }
  184. //