📄 log32.cpp
字号:
//
// 定点对数函数,32位实现
//
////////////////////////////////////////////////////////////////////////////////////////////
const int ListLen=1024;
static long Mantissa[ListLen]= {
0, 65504, 130944, 196321, 261633, 326883, 392068,
457191, 522251, 587247, 652181, 717052, 781860, 846605,
911289, 975910, 1040468, 1104965, 1169400, 1233773, 1298084,
1362334, 1426522, 1490649, 1554715, 1618720, 1682663, 1746546,
1810368, 1874130, 1937830, 2001471, 2065051, 2128571, 2192031,
2255431, 2318771, 2382051, 2445272, 2508434, 2571535, 2634578,
2697562, 2760486, 2823351, 2886158, 2948906, 3011595, 3074226,
3136798, 3199312, 3261768, 3324166, 3386506, 3448788, 3511012,
3573179, 3635288, 3697340, 3759334, 3821271, 3883151, 3944974,
4006740, 4068450, 4130102, 4191698, 4253238, 4314721, 4376148,
4437518, 4498833, 4560092, 4621295, 4682442, 4743533, 4804569,
4865549, 4926474, 4987344, 5048158, 5108918, 5169622, 5230272,
5290867, 5351407, 5411893, 5472324, 5532701, 5593024, 5653292,
5713506, 5773667, 5833773, 5893826, 5953825, 6013770, 6073662,
6133501, 6193286, 6253018, 6312697, 6372322, 6431895, 6491415,
6550883, 6610297, 6669659, 6728969, 6788226, 6847431, 6906584,
6965685, 7024734, 7083730, 7142675, 7201569, 7260410, 7319200,
7377939, 7436626, 7495262, 7553847, 7612381, 7670863, 7729295,
7787676, 7846006, 7904286, 7962515, 8020693, 8078821, 8136899,
8194927, 8252904, 8310831, 8368709, 8426536, 8484314, 8542042,
8599721, 8657349, 8714929, 8772459, 8829940, 8887372, 8944754,
9002088, 9059372, 9116608, 9173795, 9230933, 9288023, 9345064,
9402056, 9459001, 9515897, 9572745, 9629544, 9686296, 9743000,
9799656, 9856264, 9912824, 9969337, 10025802, 10082220, 10138590,
10194913, 10251189, 10307417, 10363599, 10419734, 10475821, 10531862,
10587856, 10643803, 10699704, 10755558, 10811366, 10867128, 10922843,
10978512, 11034134, 11089711, 11145242, 11200727, 11256166, 11311559,
11366906, 11422208, 11477465, 11532676, 11587841, 11642961, 11698036,
11753066, 11808051, 11862991, 11917885, 11972735, 12027540, 12082301,
12137016, 12191688, 12246314, 12300897, 12355434, 12409928, 12464377,
12518783, 12573144, 12627461, 12681734, 12735964, 12790149, 12844291,
12898389, 12952444, 13006455, 13060423, 13114347, 13168228, 13222066,
13275861, 13329613, 13383321, 13436987, 13490609, 13544189, 13597727,
13651221, 13704673, 13758082, 13811449, 13864774, 13918056, 13971296,
14024493, 14077649, 14130762, 14183834, 14236863, 14289851, 14342797,
14395701, 14448564, 14501384, 14554164, 14606901, 14659598, 14712253,
14764867, 14817439, 14869971, 14922461, 14974910, 15027319, 15079686,
15132013, 15184298, 15236544, 15288748, 15340912, 15393035, 15445118,
15497161, 15549163, 15601125, 15653047, 15704928, 15756770, 15808571,
15860333, 15912055, 15963737, 16015379, 16066981, 16118544, 16170067,
16221550, 16272995, 16324399, 16375765, 16427091, 16478378, 16529625,
16580834, 16632003, 16683134, 16734226, 16785278, 16836292, 16887268,
16938204, 16989102, 17039961, 17090782, 17141564, 17192308, 17243014,
17293681, 17344310, 17394901, 17445454, 17495969, 17546446, 17596885,
17647285, 17697649, 17747974, 17798262, 17848512, 17898724, 17948899,
17999036, 18049136, 18099199, 18149224, 18199212, 18249163, 18299076,
18348953, 18398792, 18448595, 18498360, 18548089, 18597781, 18647436,
18697054, 18746636, 18796181, 18845690, 18895162, 18944598, 18993997,
19043360, 19092686, 19141977, 19191231, 19240449, 19289631, 19338777,
19387887, 19436961, 19486000, 19535002, 19583969, 19632900, 19681795,
19730655, 19779479, 19828268, 19877021, 19925739, 19974421, 20023069,
20071681, 20120257, 20168799, 20217306, 20265777, 20314214, 20362615,
20410982, 20459314, 20507611, 20555874, 20604101, 20652294, 20700453,
20748577, 20796666, 20844721, 20892742, 20940728, 20988680, 21036598,
21084482, 21132331, 21180147, 21227928, 21275675, 21323389, 21371068,
21418714, 21466326, 21513904, 21561448, 21608959, 21656436, 21703879,
21751289, 21798666, 21846009, 21893319, 21940595, 21987838, 22035048,
22082225, 22129368, 22176479, 22223556, 22270601, 22317612, 22364591,
22411536, 22458449, 22505329, 22552177, 22598992, 22645774, 22692523,
22739240, 22785924, 22832576, 22879196, 22925783, 22972338, 23018861,
23065351, 23111809, 23158235, 23204629, 23250991, 23297321, 23343619,
23389885, 23436119, 23482322, 23528492, 23574631, 23620738, 23666813,
23712857, 23758869, 23804850, 23850799, 23896717, 23942604, 23988459,
24034282, 24080075, 24125836, 24171566, 24217265, 24262933, 24308570,
24354175, 24399750, 24445294, 24490807, 24536289, 24581740, 24627161,
24672551, 24717910, 24763239, 24808536, 24853804, 24899041, 24944247,
24989423, 25034569, 25079684, 25124769, 25169823, 25214848, 25259842,
25304806, 25349740, 25394644, 25439518, 25484362, 25529175, 25573959,
25618714, 25663438, 25708133, 25752797, 25797432, 25842038, 25886614,
25931160, 25975677, 26020164, 26064621, 26109050, 26153448, 26197818,
26242158, 26286469, 26330751, 26375003, 26419226, 26463421, 26507586,
26551722, 26595829, 26639907, 26683956, 26727976, 26771968, 26815930,
26859864, 26903769, 26947645, 26991493, 27035312, 27079103, 27122865,
27166598, 27210303, 27253979, 27297627, 27341247, 27384838, 27428401,
27471936, 27515443, 27558921, 27602371, 27645793, 27689187, 27732553,
27775891, 27819201, 27862483, 27905738, 27948964, 27992162, 28035333,
28078476, 28121591, 28164679, 28207739, 28250771, 28293776, 28336753,
28379703, 28422625, 28465520, 28508387, 28551227, 28594040, 28636825,
28679583, 28722314, 28765018, 28807694, 28850344, 28892966, 28935561,
28978130, 29020671, 29063185, 29105673, 29148133, 29190567, 29232974,
29275354, 29317707, 29360034, 29402334, 29444607, 29486854, 29529074,
29571267, 29613434, 29655575, 29697689, 29739777, 29781838, 29823873,
29865882, 29907864, 29949820, 29991750, 30033654, 30075532, 30117383,
30159209, 30201008, 30242781, 30284529, 30326250, 30367946, 30409615,
30451259, 30492877, 30534469, 30576035, 30617576, 30659091, 30700580,
30742044, 30783482, 30824894, 30866281, 30907642, 30948978, 30990289,
31031574, 31072834, 31114068, 31155277, 31196461, 31237619, 31278752,
31319860, 31360943, 31402001, 31443034, 31484041, 31525024, 31565981,
31606914, 31647821, 31688704, 31729562, 31770395, 31811203, 31851986,
31892744, 31933478, 31974187, 32014872, 32055531, 32096166, 32136777,
32177363, 32217924, 32258461, 32298974, 32339462, 32379925, 32420364,
32460779, 32501170, 32541536, 32581878, 32622196, 32662489, 32702759,
32743004, 32783225, 32823422, 32863595, 32903744, 32943869, 32983969,
33024046, 33064099, 33104129, 33144134, 33184115, 33224073, 33264007,
33303917, 33343803, 33383666, 33423505, 33463321, 33503112, 33542881,
33582625, 33622346, 33662044, 33701718, 33741369, 33780996, 33820600,
33860181, 33899738, 33939272, 33978783, 34018270, 34057734, 34097175,
34136593, 34175988, 34215359, 34254708, 34294033, 34333336, 34372615,
34411871, 34451105, 34490316, 34529503, 34568668, 34607810, 34646929,
34686025, 34725099, 34764150, 34803178, 34842183, 34881166, 34920126,
34959064, 34997979, 35036871, 35075741, 35114589, 35153413, 35192216,
35230996, 35269754, 35308489, 35347202, 35385892, 35424561, 35463207,
35501831, 35540432, 35579012, 35617569, 35656104, 35694617, 35733108,
35771577, 35810023, 35848448, 35886851, 35925232, 35963591, 36001928,
36040243, 36078536, 36116807, 36155057, 36193285, 36231491, 36269675,
36307837, 36345978, 36384098, 36422195, 36460271, 36498325, 36536358,
36574370, 36612359, 36650327, 36688274, 36726200, 36764103, 36801986,
36839847, 36877687, 36915505, 36953303, 36991078, 37028833, 37066566,
37104279, 37141970, 37179640, 37217288, 37254916, 37292522, 37330108,
37367672, 37405216, 37442738, 37480240, 37517720, 37555180, 37592619,
37630036, 37667433, 37704809, 37742165, 37779499, 37816813, 37854106,
37891379, 37928630, 37965861, 38003072, 38040261, 38077430, 38114579,
38151707, 38188814, 38225901, 38262968, 38300014, 38337039, 38374045,
38411029, 38447994, 38484938, 38521862, 38558765, 38595648, 38632511,
38669354, 38706176, 38742978, 38779760, 38816522, 38853264, 38889986,
38926687, 38963369, 39000030, 39036672, 39073293, 39109895, 39146476,
39183038, 39219580, 39256102, 39292604, 39329086, 39365548, 39401990,
39438413, 39474816, 39511199, 39547563, 39583907, 39620231, 39656535,
39692820, 39729085, 39765331, 39801557, 39837764, 39873951, 39910118,
39946266, 39982395, 40018504, 40054594, 40090664, 40126715, 40162747,
40198759, 40234752, 40270726, 40306680, 40342615, 40378531, 40414428,
40450305, 40486164, 40522003, 40557823, 40593624, 40629406, 40665169,
40700912, 40736637, 40772343, 40808029, 40843697, 40879346, 40914976,
40950587, 40986179, 41021752, 41057306, 41092842, 41128359, 41163857,
41199336, 41234796, 41270238, 41305661, 41341065, 41376451, 41411818,
41447166, 41482496, 41517807, 41553100, 41588374, 41623629, 41658866,
41694085, 41729285, 41764466, 41799630, 41834774, 41869901, 41905009,
41940098, 41975169, 42010222, 42045257, 42080273, 42115272, 42150251,
42185213, 42220156, 42255082, 42289989, 42324878, 42359749, 42394601,
42429436, 42464252, 42499051, 42533831, 42568594, 42603338, 42638065,
42672773, 42707464, 42742136, 42776791, 42811428, 42846047, 42880648,
42915231, 42949797, 42984344, 43018874, 43053386, 43087881, 43122357,
43156816, 43191258, 43225681, 43260087, 43294476, 43328846, 43363200,
43397535, 43431853, 43466154, 43500437, 43534702, 43568950, 43603180,
43637393, 43671589, 43705767, 43739928, 43774071, 43808198, 43842306,
43876398, 43910472, 43944528, 43978568, 44012590, 44046595, 44080583,
44114554, 44148507, 44182443, 44216362, 44250264, 44284149, 44318017,
44351867, 44385701, 44419517, 44453317, 44487099, 44520865, 44554613,
44588345, 44622059, 44655757, 44689438, 44723102, 44756748, 44790379,
44823992, 44857588, 44891168, 44924731, 44958277, 44991806, 45025319,
45058814, 45092294, 45125756, 45159202, 45192631, 45226043, 45259439,
45292818, 45326181, 45359527, 45392856, 45426169, 45459466, 45492745,
45526009, 45559256, 45592486, 45625700, 45658898, 45692079, 45725244,
45758392, 45791524, 45824640, 45857739, 45890822, 45923889, 45956939,
45989973, 46022991, 46055993, 46088978, 46121947, 46154900, 46187837,
46220758, 46253663, 46286551, 46319423, 46352280, 46385120, 46417944,
46450752, 46483544
};
static long LogTable[46*2+1]= {
-2139750713, -2093234393, -2046718073, -2000201754, -1953685434, -1907169114,
-1860652794, -1814136474, -1767620154, -1721103834, -1674587514, -1628071195,
-1581554875, -1535038555, -1488522235, -1442005915, -1395489595, -1348973275,
-1302456955, -1255940636, -1209424316, -1162907996, -1116391676, -1069875356,
-1023359036, -976842716, -930326396, -883810077, -837293757, -790777437,
-744261117, -697744797, -651228477, -604712157, -558195837, -511679518,
-465163198, -418646878, -372130558, -325614238, -279097918, -232581598,
-186065278, -139548959, -93032639, -46516319, 0, 46516320,
93032640, 139548960, 186065279, 232581599, 279097919, 325614239,
372130559, 418646879, 465163199, 511679519, 558195838, 604712158,
651228478, 697744798, 744261118, 790777438, 837293758, 883810078,
930326397, 976842717, 1023359037, 1069875357, 1116391677, 1162907997,
1209424317, 1255940637, 1302456956, 1348973276, 1395489596, 1442005916,
1488522236, 1535038556, 1581554876, 1628071196, 1674587515, 1721103835,
1767620155, 1814136475, 1860652795, 1907169115, 1953685435, 2000201755,
2046718074, 2093234394, 2139750714
};
////////////////////////////////////////////////////////////////////////////////////////////
long FixLog32(long x,int e)
// x为要取对数的定点数,e为x小数点的位置(e=0为整数,e=32为纯小数)
{
//unsigned int n=0,b=0;
long r;
if (x<=0) return 0x80000000;
__asm {
mov eax,x
mov cl,32
bsr ebx,eax
sub cl,bl
shl eax,cl
//mov n,eax
//mov BYTE PTR b,bl
sub ebx,e
shr eax,22
add ebx,46
mov ecx,DWORD ptr Mantissa[eax*4]
add ecx,DWORD ptr LogTable[ebx*4]
mov r,ecx
};
//r=Mantissa[n>>(32-10)]+LogTable[46+b-e];
return r;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -