commit 809b4bf1ddbc97373a9ece7c5237033c9763d2ae
parent aa8dd2326d805f0a4c21e3d88d27c4ad25ad8ed2
Author: [email protected] <[email protected]>
Date: Tue, 26 Jul 2016 20:46:36 +0300
data/sincos.hpp: Reduce table size
Diffstat:
1 file changed, 12 insertions(+), 197 deletions(-)
diff --git a/include/kfr/data/sincos.hpp b/include/kfr/data/sincos.hpp
@@ -33,7 +33,7 @@ namespace data
// data generated by mpfr
template <typename T>
-constexpr T c_sin_table[256] = {
+constexpr T c_sin_table[64] = {
/* sin(2*pi* 0/ 256) */ T(0.0),
/* sin(2*pi* 1/ 256) */ T(0.02454122852291228803173452945928292506547),
/* sin(2*pi* 2/ 256) */ T(0.04906767432741801425495497694268265831475),
@@ -97,208 +97,23 @@ constexpr T c_sin_table[256] = {
/* sin(2*pi* 60/ 256) */ T(0.9951847266721968862448369531094799215755),
/* sin(2*pi* 61/ 256) */ T(0.9972904566786902161355971401825678211717),
/* sin(2*pi* 62/ 256) */ T(0.9987954562051723927147716047591006944432),
- /* sin(2*pi* 63/ 256) */ T(0.9996988186962042201157656496661721968501),
- /* sin(2*pi* 64/ 256) */ T(1.0),
- /* sin(2*pi* 65/ 256) */ T(0.9996988186962042201157656496661721968501),
- /* sin(2*pi* 66/ 256) */ T(0.9987954562051723927147716047591006944432),
- /* sin(2*pi* 67/ 256) */ T(0.9972904566786902161355971401825678211717),
- /* sin(2*pi* 68/ 256) */ T(0.9951847266721968862448369531094799215755),
- /* sin(2*pi* 69/ 256) */ T(0.9924795345987099981567672516611178200108),
- /* sin(2*pi* 70/ 256) */ T(0.9891765099647809734516737380162430639837),
- /* sin(2*pi* 71/ 256) */ T(0.9852776423889412447740184331785477871601),
- /* sin(2*pi* 72/ 256) */ T(0.9807852804032304491261822361342390369739),
- /* sin(2*pi* 73/ 256) */ T(0.975702130038528544460395766419527971644),
- /* sin(2*pi* 74/ 256) */ T(0.9700312531945439926039842072861002514569),
- /* sin(2*pi* 75/ 256) */ T(0.9637760657954398666864643555078351536631),
- /* sin(2*pi* 76/ 256) */ T(0.9569403357322088649357978869802699694828),
- /* sin(2*pi* 77/ 256) */ T(0.9495281805930366671959360741893450282522),
- /* sin(2*pi* 78/ 256) */ T(0.9415440651830207784125094025995023571856),
- /* sin(2*pi* 79/ 256) */ T(0.932992798834738887711660255543302498295),
- /* sin(2*pi* 80/ 256) */ T(0.9238795325112867561281831893967882868224),
- /* sin(2*pi* 81/ 256) */ T(0.9142097557035306546350148293935774010447),
- /* sin(2*pi* 82/ 256) */ T(0.9039892931234433315862002972305370487101),
- /* sin(2*pi* 83/ 256) */ T(0.8932243011955153203424164474933979780006),
- /* sin(2*pi* 84/ 256) */ T(0.8819212643483550297127568636603883495084),
- /* sin(2*pi* 85/ 256) */ T(0.8700869911087114186522924044838488439108),
- /* sin(2*pi* 86/ 256) */ T(0.8577286100002720699022699842847701370425),
- /* sin(2*pi* 87/ 256) */ T(0.8448535652497070732595712051049570977198),
- /* sin(2*pi* 88/ 256) */ T(0.8314696123025452370787883776179057567386),
- /* sin(2*pi* 89/ 256) */ T(0.817584813151583696504920884130633809471),
- /* sin(2*pi* 90/ 256) */ T(0.8032075314806449098066765129631419238796),
- /* sin(2*pi* 91/ 256) */ T(0.7883464276266062620091647053596892826565),
- /* sin(2*pi* 92/ 256) */ T(0.773010453362736960810906609758469800971),
- /* sin(2*pi* 93/ 256) */ T(0.7572088465064845475754640536057844730404),
- /* sin(2*pi* 94/ 256) */ T(0.740951125354959091175616897495162729729),
- /* sin(2*pi* 95/ 256) */ T(0.7242470829514669209410692432905531674831),
- /* sin(2*pi* 96/ 256) */ T(0.7071067811865475244008443621048490392848),
- /* sin(2*pi* 97/ 256) */ T(0.6895405447370669246167306299574847028455),
- /* sin(2*pi* 98/ 256) */ T(0.6715589548470184006253768504274218032288),
- /* sin(2*pi* 99/ 256) */ T(0.6531728429537767640842030136563054150769),
- /* sin(2*pi* 100/ 256) */ T(0.6343932841636454982151716132254933706757),
- /* sin(2*pi* 101/ 256) */ T(0.6152315905806268454849135634139842776594),
- /* sin(2*pi* 102/ 256) */ T(0.5956993044924333434670365288299698895119),
- /* sin(2*pi* 103/ 256) */ T(0.575808191417845300745972453815730841776),
- /* sin(2*pi* 104/ 256) */ T(0.5555702330196022247428308139485328743749),
- /* sin(2*pi* 105/ 256) */ T(0.5349976198870972106630769046370179155603),
- /* sin(2*pi* 106/ 256) */ T(0.514102744193221726593693838968815772608),
- /* sin(2*pi* 107/ 256) */ T(0.4928981922297840368730266887588092682397),
- /* sin(2*pi* 108/ 256) */ T(0.4713967368259976485563876259052543776575),
- /* sin(2*pi* 109/ 256) */ T(0.4496113296546066000462945794242270758832),
- /* sin(2*pi* 110/ 256) */ T(0.4275550934302820943209668568887985343046),
- /* sin(2*pi* 111/ 256) */ T(0.4052413140049898709084813055050524665119),
- /* sin(2*pi* 112/ 256) */ T(0.3826834323650897717284599840303988667613),
- /* sin(2*pi* 113/ 256) */ T(0.3598950365349881487751045723267564202023),
- /* sin(2*pi* 114/ 256) */ T(0.3368898533922200506892532126191475704778),
- /* sin(2*pi* 115/ 256) */ T(0.3136817403988914766564788459941003099934),
- /* sin(2*pi* 116/ 256) */ T(0.2902846772544623676361923758173952746915),
- /* sin(2*pi* 117/ 256) */ T(0.2667127574748983863252865151164363940421),
- /* sin(2*pi* 118/ 256) */ T(0.242980179903263889948274162077471118321),
- /* sin(2*pi* 119/ 256) */ T(0.2191012401568697972277375474973577988484),
- /* sin(2*pi* 120/ 256) */ T(0.1950903220161282678482848684770222409277),
- /* sin(2*pi* 121/ 256) */ T(0.1709618887603012263636423572082635319663),
- /* sin(2*pi* 122/ 256) */ T(0.1467304744553617516588501296467178197062),
- /* sin(2*pi* 123/ 256) */ T(0.1224106751992161984987044741509457875752),
- /* sin(2*pi* 124/ 256) */ T(0.09801714032956060199419556388864184586114),
- /* sin(2*pi* 125/ 256) */ T(0.0735645635996674235294656215752343218133),
- /* sin(2*pi* 126/ 256) */ T(0.04906767432741801425495497694268265831475),
- /* sin(2*pi* 127/ 256) */ T(0.02454122852291228803173452945928292506547),
- /* sin(2*pi* 128/ 256) */ T(0.0),
- /* sin(2*pi* 129/ 256) */ T(-0.02454122852291228803173452945928292506547),
- /* sin(2*pi* 130/ 256) */ T(-0.04906767432741801425495497694268265831475),
- /* sin(2*pi* 131/ 256) */ T(-0.0735645635996674235294656215752343218133),
- /* sin(2*pi* 132/ 256) */ T(-0.09801714032956060199419556388864184586114),
- /* sin(2*pi* 133/ 256) */ T(-0.1224106751992161984987044741509457875752),
- /* sin(2*pi* 134/ 256) */ T(-0.1467304744553617516588501296467178197062),
- /* sin(2*pi* 135/ 256) */ T(-0.1709618887603012263636423572082635319663),
- /* sin(2*pi* 136/ 256) */ T(-0.1950903220161282678482848684770222409277),
- /* sin(2*pi* 137/ 256) */ T(-0.2191012401568697972277375474973577988484),
- /* sin(2*pi* 138/ 256) */ T(-0.242980179903263889948274162077471118321),
- /* sin(2*pi* 139/ 256) */ T(-0.2667127574748983863252865151164363940421),
- /* sin(2*pi* 140/ 256) */ T(-0.2902846772544623676361923758173952746915),
- /* sin(2*pi* 141/ 256) */ T(-0.3136817403988914766564788459941003099934),
- /* sin(2*pi* 142/ 256) */ T(-0.3368898533922200506892532126191475704778),
- /* sin(2*pi* 143/ 256) */ T(-0.3598950365349881487751045723267564202023),
- /* sin(2*pi* 144/ 256) */ T(-0.3826834323650897717284599840303988667613),
- /* sin(2*pi* 145/ 256) */ T(-0.4052413140049898709084813055050524665119),
- /* sin(2*pi* 146/ 256) */ T(-0.4275550934302820943209668568887985343046),
- /* sin(2*pi* 147/ 256) */ T(-0.4496113296546066000462945794242270758832),
- /* sin(2*pi* 148/ 256) */ T(-0.4713967368259976485563876259052543776575),
- /* sin(2*pi* 149/ 256) */ T(-0.4928981922297840368730266887588092682397),
- /* sin(2*pi* 150/ 256) */ T(-0.514102744193221726593693838968815772608),
- /* sin(2*pi* 151/ 256) */ T(-0.5349976198870972106630769046370179155603),
- /* sin(2*pi* 152/ 256) */ T(-0.5555702330196022247428308139485328743749),
- /* sin(2*pi* 153/ 256) */ T(-0.575808191417845300745972453815730841776),
- /* sin(2*pi* 154/ 256) */ T(-0.5956993044924333434670365288299698895119),
- /* sin(2*pi* 155/ 256) */ T(-0.6152315905806268454849135634139842776594),
- /* sin(2*pi* 156/ 256) */ T(-0.6343932841636454982151716132254933706757),
- /* sin(2*pi* 157/ 256) */ T(-0.6531728429537767640842030136563054150769),
- /* sin(2*pi* 158/ 256) */ T(-0.6715589548470184006253768504274218032288),
- /* sin(2*pi* 159/ 256) */ T(-0.6895405447370669246167306299574847028455),
- /* sin(2*pi* 160/ 256) */ T(-0.7071067811865475244008443621048490392848),
- /* sin(2*pi* 161/ 256) */ T(-0.7242470829514669209410692432905531674831),
- /* sin(2*pi* 162/ 256) */ T(-0.740951125354959091175616897495162729729),
- /* sin(2*pi* 163/ 256) */ T(-0.7572088465064845475754640536057844730404),
- /* sin(2*pi* 164/ 256) */ T(-0.773010453362736960810906609758469800971),
- /* sin(2*pi* 165/ 256) */ T(-0.7883464276266062620091647053596892826565),
- /* sin(2*pi* 166/ 256) */ T(-0.8032075314806449098066765129631419238796),
- /* sin(2*pi* 167/ 256) */ T(-0.817584813151583696504920884130633809471),
- /* sin(2*pi* 168/ 256) */ T(-0.8314696123025452370787883776179057567386),
- /* sin(2*pi* 169/ 256) */ T(-0.8448535652497070732595712051049570977198),
- /* sin(2*pi* 170/ 256) */ T(-0.8577286100002720699022699842847701370425),
- /* sin(2*pi* 171/ 256) */ T(-0.8700869911087114186522924044838488439108),
- /* sin(2*pi* 172/ 256) */ T(-0.8819212643483550297127568636603883495084),
- /* sin(2*pi* 173/ 256) */ T(-0.8932243011955153203424164474933979780006),
- /* sin(2*pi* 174/ 256) */ T(-0.9039892931234433315862002972305370487101),
- /* sin(2*pi* 175/ 256) */ T(-0.9142097557035306546350148293935774010447),
- /* sin(2*pi* 176/ 256) */ T(-0.9238795325112867561281831893967882868224),
- /* sin(2*pi* 177/ 256) */ T(-0.932992798834738887711660255543302498295),
- /* sin(2*pi* 178/ 256) */ T(-0.9415440651830207784125094025995023571856),
- /* sin(2*pi* 179/ 256) */ T(-0.9495281805930366671959360741893450282522),
- /* sin(2*pi* 180/ 256) */ T(-0.9569403357322088649357978869802699694828),
- /* sin(2*pi* 181/ 256) */ T(-0.9637760657954398666864643555078351536631),
- /* sin(2*pi* 182/ 256) */ T(-0.9700312531945439926039842072861002514569),
- /* sin(2*pi* 183/ 256) */ T(-0.975702130038528544460395766419527971644),
- /* sin(2*pi* 184/ 256) */ T(-0.9807852804032304491261822361342390369739),
- /* sin(2*pi* 185/ 256) */ T(-0.9852776423889412447740184331785477871601),
- /* sin(2*pi* 186/ 256) */ T(-0.9891765099647809734516737380162430639837),
- /* sin(2*pi* 187/ 256) */ T(-0.9924795345987099981567672516611178200108),
- /* sin(2*pi* 188/ 256) */ T(-0.9951847266721968862448369531094799215755),
- /* sin(2*pi* 189/ 256) */ T(-0.9972904566786902161355971401825678211717),
- /* sin(2*pi* 190/ 256) */ T(-0.9987954562051723927147716047591006944432),
- /* sin(2*pi* 191/ 256) */ T(-0.9996988186962042201157656496661721968501),
- /* sin(2*pi* 192/ 256) */ T(-1.0),
- /* sin(2*pi* 193/ 256) */ T(-0.9996988186962042201157656496661721968501),
- /* sin(2*pi* 194/ 256) */ T(-0.9987954562051723927147716047591006944432),
- /* sin(2*pi* 195/ 256) */ T(-0.9972904566786902161355971401825678211717),
- /* sin(2*pi* 196/ 256) */ T(-0.9951847266721968862448369531094799215755),
- /* sin(2*pi* 197/ 256) */ T(-0.9924795345987099981567672516611178200108),
- /* sin(2*pi* 198/ 256) */ T(-0.9891765099647809734516737380162430639837),
- /* sin(2*pi* 199/ 256) */ T(-0.9852776423889412447740184331785477871601),
- /* sin(2*pi* 200/ 256) */ T(-0.9807852804032304491261822361342390369739),
- /* sin(2*pi* 201/ 256) */ T(-0.975702130038528544460395766419527971644),
- /* sin(2*pi* 202/ 256) */ T(-0.9700312531945439926039842072861002514569),
- /* sin(2*pi* 203/ 256) */ T(-0.9637760657954398666864643555078351536631),
- /* sin(2*pi* 204/ 256) */ T(-0.9569403357322088649357978869802699694828),
- /* sin(2*pi* 205/ 256) */ T(-0.9495281805930366671959360741893450282522),
- /* sin(2*pi* 206/ 256) */ T(-0.9415440651830207784125094025995023571856),
- /* sin(2*pi* 207/ 256) */ T(-0.932992798834738887711660255543302498295),
- /* sin(2*pi* 208/ 256) */ T(-0.9238795325112867561281831893967882868224),
- /* sin(2*pi* 209/ 256) */ T(-0.9142097557035306546350148293935774010447),
- /* sin(2*pi* 210/ 256) */ T(-0.9039892931234433315862002972305370487101),
- /* sin(2*pi* 211/ 256) */ T(-0.8932243011955153203424164474933979780006),
- /* sin(2*pi* 212/ 256) */ T(-0.8819212643483550297127568636603883495084),
- /* sin(2*pi* 213/ 256) */ T(-0.8700869911087114186522924044838488439108),
- /* sin(2*pi* 214/ 256) */ T(-0.8577286100002720699022699842847701370425),
- /* sin(2*pi* 215/ 256) */ T(-0.8448535652497070732595712051049570977198),
- /* sin(2*pi* 216/ 256) */ T(-0.8314696123025452370787883776179057567386),
- /* sin(2*pi* 217/ 256) */ T(-0.817584813151583696504920884130633809471),
- /* sin(2*pi* 218/ 256) */ T(-0.8032075314806449098066765129631419238796),
- /* sin(2*pi* 219/ 256) */ T(-0.7883464276266062620091647053596892826565),
- /* sin(2*pi* 220/ 256) */ T(-0.773010453362736960810906609758469800971),
- /* sin(2*pi* 221/ 256) */ T(-0.7572088465064845475754640536057844730404),
- /* sin(2*pi* 222/ 256) */ T(-0.740951125354959091175616897495162729729),
- /* sin(2*pi* 223/ 256) */ T(-0.7242470829514669209410692432905531674831),
- /* sin(2*pi* 224/ 256) */ T(-0.7071067811865475244008443621048490392848),
- /* sin(2*pi* 225/ 256) */ T(-0.6895405447370669246167306299574847028455),
- /* sin(2*pi* 226/ 256) */ T(-0.6715589548470184006253768504274218032288),
- /* sin(2*pi* 227/ 256) */ T(-0.6531728429537767640842030136563054150769),
- /* sin(2*pi* 228/ 256) */ T(-0.6343932841636454982151716132254933706757),
- /* sin(2*pi* 229/ 256) */ T(-0.6152315905806268454849135634139842776594),
- /* sin(2*pi* 230/ 256) */ T(-0.5956993044924333434670365288299698895119),
- /* sin(2*pi* 231/ 256) */ T(-0.575808191417845300745972453815730841776),
- /* sin(2*pi* 232/ 256) */ T(-0.5555702330196022247428308139485328743749),
- /* sin(2*pi* 233/ 256) */ T(-0.5349976198870972106630769046370179155603),
- /* sin(2*pi* 234/ 256) */ T(-0.514102744193221726593693838968815772608),
- /* sin(2*pi* 235/ 256) */ T(-0.4928981922297840368730266887588092682397),
- /* sin(2*pi* 236/ 256) */ T(-0.4713967368259976485563876259052543776575),
- /* sin(2*pi* 237/ 256) */ T(-0.4496113296546066000462945794242270758832),
- /* sin(2*pi* 238/ 256) */ T(-0.4275550934302820943209668568887985343046),
- /* sin(2*pi* 239/ 256) */ T(-0.4052413140049898709084813055050524665119),
- /* sin(2*pi* 240/ 256) */ T(-0.3826834323650897717284599840303988667613),
- /* sin(2*pi* 241/ 256) */ T(-0.3598950365349881487751045723267564202023),
- /* sin(2*pi* 242/ 256) */ T(-0.3368898533922200506892532126191475704778),
- /* sin(2*pi* 243/ 256) */ T(-0.3136817403988914766564788459941003099934),
- /* sin(2*pi* 244/ 256) */ T(-0.2902846772544623676361923758173952746915),
- /* sin(2*pi* 245/ 256) */ T(-0.2667127574748983863252865151164363940421),
- /* sin(2*pi* 246/ 256) */ T(-0.242980179903263889948274162077471118321),
- /* sin(2*pi* 247/ 256) */ T(-0.2191012401568697972277375474973577988484),
- /* sin(2*pi* 248/ 256) */ T(-0.1950903220161282678482848684770222409277),
- /* sin(2*pi* 249/ 256) */ T(-0.1709618887603012263636423572082635319663),
- /* sin(2*pi* 250/ 256) */ T(-0.1467304744553617516588501296467178197062),
- /* sin(2*pi* 251/ 256) */ T(-0.1224106751992161984987044741509457875752),
- /* sin(2*pi* 252/ 256) */ T(-0.09801714032956060199419556388864184586114),
- /* sin(2*pi* 253/ 256) */ T(-0.0735645635996674235294656215752343218133),
- /* sin(2*pi* 254/ 256) */ T(-0.04906767432741801425495497694268265831475),
- /* sin(2*pi* 255/ 256) */ T(-0.02454122852291228803173452945928292506547),
-
+ /* sin(2*pi* 63/ 256) */ T(0.9996988186962042201157656496661721968501)
};
}
template <typename T>
+constexpr inline T sin_using_table_256(size_t k)
+{
+ return (k == 0 || k == 128) ? T(0) : (k == 64) ? T(1) : (k > 128)
+ ? -sin_using_table_256<T>(k - 128)
+ : (k > 64) ? sin_using_table_256<T>(128 - k)
+ : data::c_sin_table<T>[k];
+}
+
+template <typename T>
constexpr inline T sin_using_table(size_t size, size_t k)
{
- constexpr size_t table_size = arraysize(data::c_sin_table<T>);
- return data::c_sin_table<T>[(k * table_size / size) % table_size];
+ return sin_using_table_256<T>((k * 256 / size) % 256);
}
template <typename T>
constexpr inline T cos_using_table(size_t size, size_t k)