~ chicken-core (chicken-5) /tests/fft.scm
Trap1;;;; fft.scm - fft benchmark, by Bradley Lucier234(cond-expand5 ((not chicken) ; disable in CHICKEN to test specialization in safe mode6 (declare7 (standard-bindings)8 (extended-bindings)9 (block)10 (not safe)))11 (else12 (import (chicken bitwise)13 (chicken fixnum)14 (chicken flonum)15 (chicken process-context))))1617;;; All the following redefinitions are *ignored* by the Gambit compiler18;;; because of the declarations above.1920(define-syntax defalias21 (syntax-rules ()22 ((_ one two)23 (define-syntax one24 (syntax-rules ()25 ((_ . args) (two . args)))))))2627(cond-expand28 (generic29 (begin30 (defalias fixnum->flonum exact->inexact)31 (defalias fxodd? odd?)32 (defalias fxeven? even?)33 (defalias fxarithmetic-shift-right fxshr)34 (defalias fxarithmetic-shift-left fxshl)35 (defalias fl* *)36 (defalias fl/ /)37 (defalias fl+ +)38 (defalias fl- -)))39 (chicken40 (begin41 (defalias fixnum->flonum exact->inexact)42 (defalias fxodd? odd?)43 (defalias fxeven? even?)44 (defalias fxarithmetic-shift-right fxshr)45 (defalias fxarithmetic-shift-left fxshl)46 (defalias fl* fp*)47 (defalias fl/ fp/)48 (defalias fl+ fp+)49 (defalias fl- fp-)))50 (else))5152(cond-expand53 ((and chicken (not unboxed))54 (begin55 (defalias make-f64vector make-vector)56 (defalias f64vector vector)57 (defalias f64vector-set! vector-set!)58 (defalias f64vector-ref vector-ref)59 (defalias list->f64vector list->vector)60 (defalias f64vector-length vector-length)) )61 (chicken62 (import srfi-4))63 (else) )6465;;; end of *ignored* definitions6667(define lut-table-size 512)68(define lut-table-size^2 262144)69(define lut-table-size^3 134217728)70(define log-lut-table-size 9)7172(define low-lut73 (list->f64vector '(1. 0.74 .7071067811865476 .707106781186547675 .9238795325112867 .382683432365089876 .3826834323650898 .923879532511286777 .9807852804032304 .1950903220161282878 .5555702330196022 .831469612302545279 .8314696123025452 .555570233019602280 .19509032201612828 .980785280403230481 .9951847266721969 .098017140329560682 .6343932841636455 .77301045336273783 .881921264348355 .4713967368259976484 .2902846772544624 .956940335732208885 .9569403357322088 .290284677254462486 .47139673682599764 .88192126434835587 .773010453362737 .634393284163645588 .0980171403295606 .995184726672196989 .9987954562051724 .04906767432741801590 .6715589548470184 .740951125354959191 .9039892931234433 .427555093430282192 .33688985339222005 .941544065183020893 .970031253194544 .242980179903263994 .5141027441932218 .857728610000272195 .8032075314806449 .595699304492433496 .14673047445536175 .98917650996478197 .989176509964781 .1467304744553617598 .5956993044924334 .803207531480644999 .8577286100002721 .5141027441932218100 .2429801799032639 .970031253194544101 .9415440651830208 .33688985339222005102 .4275550934302821 .9039892931234433103 .7409511253549591 .6715589548470184104 .049067674327418015 .9987954562051724105 .9996988186962042 .024541228522912288106 .6895405447370669 .7242470829514669107 .9142097557035307 .40524131400498986108 .35989503653498817 .9329927988347388109 .9757021300385286 .2191012401568698110 .5349976198870973 .8448535652497071111 .8175848131515837 .5758081914178453112 .17096188876030122 .9852776423889412113 .99247953459871 .1224106751992162114 .6152315905806268 .7883464276266062115 .8700869911087115 .49289819222978404116 .26671275747489837 .9637760657954398117 .9495281805930367 .31368174039889146118 .4496113296546066 .8932243011955153119 .7572088465064846 .6531728429537768120 .07356456359966743 .9972904566786902121 .9972904566786902 .07356456359966743122 .6531728429537768 .7572088465064846123 .8932243011955153 .4496113296546066124 .31368174039889146 .9495281805930367125 .9637760657954398 .26671275747489837126 .49289819222978404 .8700869911087115127 .7883464276266062 .6152315905806268128 .1224106751992162 .99247953459871129 .9852776423889412 .17096188876030122130 .5758081914178453 .8175848131515837131 .8448535652497071 .5349976198870973132 .2191012401568698 .9757021300385286133 .9329927988347388 .35989503653498817134 .40524131400498986 .9142097557035307135 .7242470829514669 .6895405447370669136 .024541228522912288 .9996988186962042137 .9999247018391445 .012271538285719925138 .6983762494089728 .7157308252838187139 .9191138516900578 .3939920400610481140 .37131719395183754 .9285060804732156141 .9783173707196277 .20711137619221856142 .5453249884220465 .8382247055548381143 .8245893027850253 .5657318107836132144 .18303988795514095 .9831054874312163145 .9939069700023561 .11022220729388306146 .6248594881423863 .7807372285720945147 .8760700941954066 .4821837720791228148 .2785196893850531 .9604305194155658149 .9533060403541939 .3020059493192281150 .46053871095824 .8876396204028539151 .765167265622459 .6438315428897915152 .0857973123444399 .996312612182778153 .9981181129001492 .06132073630220858154 .6624157775901718 .7491363945234594155 .8986744656939538 .43861623853852766156 .3253102921622629 .9456073253805213157 .9669764710448521 .25486565960451457158 .5035383837257176 .8639728561215867159 .7958369046088836 .6055110414043255160 .1345807085071262 .99090263542778161 .9873014181578584 .15885814333386145162 .5857978574564389 .8104571982525948163 .8513551931052652 .524589682678469164 .2310581082806711 .9729399522055602165 .937339011912575 .34841868024943456166 .4164295600976372 .9091679830905224167 .7326542716724128 .680600997795453168 .03680722294135883 .9993223845883495169 .9993223845883495 .03680722294135883170 .680600997795453 .7326542716724128171 .9091679830905224 .4164295600976372172 .34841868024943456 .937339011912575173 .9729399522055602 .2310581082806711174 .524589682678469 .8513551931052652175 .8104571982525948 .5857978574564389176 .15885814333386145 .9873014181578584177 .99090263542778 .1345807085071262178 .6055110414043255 .7958369046088836179 .8639728561215867 .5035383837257176180 .25486565960451457 .9669764710448521181 .9456073253805213 .3253102921622629182 .43861623853852766 .8986744656939538183 .7491363945234594 .6624157775901718184 .06132073630220858 .9981181129001492185 .996312612182778 .0857973123444399186 .6438315428897915 .765167265622459187 .8876396204028539 .46053871095824188 .3020059493192281 .9533060403541939189 .9604305194155658 .2785196893850531190 .4821837720791228 .8760700941954066191 .7807372285720945 .6248594881423863192 .11022220729388306 .9939069700023561193 .9831054874312163 .18303988795514095194 .5657318107836132 .8245893027850253195 .8382247055548381 .5453249884220465196 .20711137619221856 .9783173707196277197 .9285060804732156 .37131719395183754198 .3939920400610481 .9191138516900578199 .7157308252838187 .6983762494089728200 .012271538285719925 .9999247018391445201 .9999811752826011 .006135884649154475202 .7027547444572253 .7114321957452164203 .9215140393420419 .3883450466988263204 .37700741021641826 .9262102421383114205 .9795697656854405 .2011046348420919206 .5504579729366048 .83486287498638207 .8280450452577558 .560661576197336208 .18906866414980622 .9819638691095552209 .9945645707342554 .10412163387205457210 .629638238914927 .7768884656732324211 .8790122264286335 .47679923006332214212 .2844075372112718 .9587034748958716213 .9551411683057707 .29615088824362384214 .4659764957679662 .8847970984309378215 .7691033376455796 .6391244448637757216 .09190895649713272 .9957674144676598217 .9984755805732948 .05519524434968994218 .6669999223036375 .745057785441466219 .901348847046022 .43309381885315196220 .33110630575987643 .9435934581619604221 .9685220942744173 .24892760574572018222 .508830142543107 .8608669386377673223 .799537269107905 .600616479383869224 .14065823933284924 .9900582102622971225 .9882575677307495 .15279718525844344226 .5907597018588743 .8068475535437992227 .8545579883654005 .5193559901655896228 .2370236059943672 .9715038909862518229 .9394592236021899 .3426607173119944230 .4220002707997997 .9065957045149153231 .7368165688773699 .6760927035753159232 .04293825693494082 .9990777277526454233 .9995294175010931 .030674803176636626234 .6850836677727004 .7284643904482252235 .9117060320054299 .41084317105790397236 .3541635254204904 .9351835099389476237 .9743393827855759 .22508391135979283238 .5298036246862947 .8481203448032972239 .8140363297059484 .5808139580957645240 .16491312048996992 .9863080972445987241 .9917097536690995 .12849811079379317242 .6103828062763095 .7921065773002124243 .8670462455156926 .49822766697278187244 .2607941179152755 .9653944416976894245 .9475855910177411 .3195020308160157246 .44412214457042926 .8959662497561851247 .7531867990436125 .6578066932970786248 .06744391956366406 .9977230666441916249 .9968202992911657 .07968243797143013250 .6485144010221124 .7612023854842618251 .8904487232447579 .45508358712634384252 .30784964004153487 .9514350209690083253 .9621214042690416 .272621355449949254 .48755016014843594 .8730949784182901255 .7845565971555752 .6200572117632892256 .11631863091190477 .9932119492347945257 .984210092386929 .17700422041214875258 .5707807458869673 .8211025149911046259 .8415549774368984 .5401714727298929260 .21311031991609136 .9770281426577544261 .9307669610789837 .36561299780477385262 .39962419984564684 .9166790599210427263 .7200025079613817 .693971460889654264 .01840672990580482 .9998305817958234265 .9998305817958234 .01840672990580482266 .693971460889654 .7200025079613817267 .9166790599210427 .39962419984564684268 .36561299780477385 .9307669610789837269 .9770281426577544 .21311031991609136270 .5401714727298929 .8415549774368984271 .8211025149911046 .5707807458869673272 .17700422041214875 .984210092386929273 .9932119492347945 .11631863091190477274 .6200572117632892 .7845565971555752275 .8730949784182901 .48755016014843594276 .272621355449949 .9621214042690416277 .9514350209690083 .30784964004153487278 .45508358712634384 .8904487232447579279 .7612023854842618 .6485144010221124280 .07968243797143013 .9968202992911657281 .9977230666441916 .06744391956366406282 .6578066932970786 .7531867990436125283 .8959662497561851 .44412214457042926284 .3195020308160157 .9475855910177411285 .9653944416976894 .2607941179152755286 .49822766697278187 .8670462455156926287 .7921065773002124 .6103828062763095288 .12849811079379317 .9917097536690995289 .9863080972445987 .16491312048996992290 .5808139580957645 .8140363297059484291 .8481203448032972 .5298036246862947292 .22508391135979283 .9743393827855759293 .9351835099389476 .3541635254204904294 .41084317105790397 .9117060320054299295 .7284643904482252 .6850836677727004296 .030674803176636626 .9995294175010931297 .9990777277526454 .04293825693494082298 .6760927035753159 .7368165688773699299 .9065957045149153 .4220002707997997300 .3426607173119944 .9394592236021899301 .9715038909862518 .2370236059943672302 .5193559901655896 .8545579883654005303 .8068475535437992 .5907597018588743304 .15279718525844344 .9882575677307495305 .9900582102622971 .14065823933284924306 .600616479383869 .799537269107905307 .8608669386377673 .508830142543107308 .24892760574572018 .9685220942744173309 .9435934581619604 .33110630575987643310 .43309381885315196 .901348847046022311 .745057785441466 .6669999223036375312 .05519524434968994 .9984755805732948313 .9957674144676598 .09190895649713272314 .6391244448637757 .7691033376455796315 .8847970984309378 .4659764957679662316 .29615088824362384 .9551411683057707317 .9587034748958716 .2844075372112718318 .47679923006332214 .8790122264286335319 .7768884656732324 .629638238914927320 .10412163387205457 .9945645707342554321 .9819638691095552 .18906866414980622322 .560661576197336 .8280450452577558323 .83486287498638 .5504579729366048324 .2011046348420919 .9795697656854405325 .9262102421383114 .37700741021641826326 .3883450466988263 .9215140393420419327 .7114321957452164 .7027547444572253328 .006135884649154475 .9999811752826011329 .9999952938095762 .003067956762965976330 .7049340803759049 .7092728264388657331 .9227011283338785 .38551605384391885332 .37984720892405116 .9250492407826776333 .9801821359681174 .1980984107179536334 .5530167055800276 .8331701647019132335 .829761233794523 .5581185312205561336 .19208039704989244 .9813791933137546337 .9948793307948056 .10106986275482782338 .6320187359398091 .7749531065948739339 .8804708890521608 .47410021465055340 .2873474595447295 .9578264130275329341 .9560452513499964 .29321916269425863342 .46868882203582796 .8833633386657316343 .7710605242618138 .6367618612362842344 .094963495329639 .9954807554919269345 .9986402181802653 .052131704680283324346 .6692825883466361 .7430079521351217347 .9026733182372588 .4303264813400826348 .3339996514420094 .9425731976014469349 .9692812353565485 .24595505033579462350 .5114688504379704 .8593018183570084351 .8013761717231402 .5981607069963423352 .14369503315029444 .9896220174632009353 .9887216919603238 .1497645346773215354 .5932322950397998 .8050313311429635355 .8561473283751945 .5167317990176499356 .2400030224487415 .9707721407289504357 .9405060705932683 .33977688440682685358 .4247796812091088 .9052967593181188359 .7388873244606151 .673829000378756360 .04600318213091463 .9989412931868569361 .9996188224951786 .027608145778965743362 .6873153408917592 .726359155084346363 .9129621904283982 .4080441628649787364 .35703096123343003 .9340925504042589365 .9750253450669941 .22209362097320354366 .532403127877198 .8464909387740521367 .8158144108067338 .5783137964116556368 .16793829497473117 .9857975091675675369 .9920993131421918 .12545498341154623370 .6128100824294097 .79023022143731371 .8685707059713409 .49556526182577254372 .2637546789748314 .9645897932898128373 .9485613499157303 .31659337555616585374 .4468688401623742 .8945994856313827375 .7552013768965365 .6554928529996153376 .07050457338961387 .9975114561403035377 .997060070339483 .07662386139203149378 .6508466849963809 .7592091889783881379 .8918407093923427 .4523495872337709380 .3107671527496115 .9504860739494817381 .9629532668736839 .2696683255729151382 .49022648328829116 .8715950866559511383 .7864552135990858 .617647307937804384 .11936521481099137 .9928504144598651385 .9847485018019042 .17398387338746382386 .5732971666980422 .819347520076797387 .8432082396418454 .5375870762956455388 .21610679707621952 .9763697313300211389 .9318842655816681 .3627557243673972390 .40243465085941843 .9154487160882678391 .7221281939292153 .6917592583641577392 .021474080275469508 .9997694053512153393 .9998823474542126 .015339206284988102394 .696177131491463 .7178700450557317395 .9179007756213905 .3968099874167103396 .3684668299533723 .9296408958431812397 .9776773578245099 .2101118368804696398 .5427507848645159 .8398937941959995399 .8228497813758263 .5682589526701316400 .18002290140569951 .9836624192117303401 .9935641355205953 .11327095217756435402 .62246127937415 .7826505961665757403 .8745866522781761 .4848692480007911404 .27557181931095814 .9612804858113206405 .9523750127197659 .30492922973540243406 .45781330359887723 .8890483558546646407 .7631884172633813 .6461760129833164408 .08274026454937569 .9965711457905548409 .997925286198596 .06438263092985747410 .6601143420674205 .7511651319096864411 .8973245807054183 .44137126873171667412 .32240767880106985 .9466009130832835413 .9661900034454125 .257831102162159414 .5008853826112408 .8655136240905691415 .7939754775543372 .6079497849677736416 .13154002870288312 .9913108598461154417 .9868094018141855 .16188639378011183418 .5833086529376983 .8122505865852039419 .8497417680008524 .5271991347819014420 .22807208317088573 .973644249650812421 .9362656671702783 .35129275608556715422 .41363831223843456 .9104412922580672423 .7305627692278276 .6828455463852481424 .03374117185137759 .9994306045554617425 .9992047586183639 .03987292758773981426 .6783500431298615 .7347388780959635427 .9078861164876663 .41921688836322396428 .34554132496398904 .9384035340631081429 .9722264970789363 .23404195858354343430 .5219752929371544 .8529606049303636431 .808656181588175 .5882815482226453432 .15582839765426523 .9877841416445722433 .9904850842564571 .13762012158648604434 .6030665985403482 .7976908409433912435 .8624239561110405 .5061866453451553436 .25189781815421697 .9677538370934755437 .9446048372614803 .32820984357909255438 .4358570799222555 .9000158920161603439 .7471006059801801 .6647109782033449440 .05825826450043576 .9983015449338929441 .996044700901252 .0888535525825246442 .6414810128085832 .7671389119358204443 .8862225301488806 .4632597835518602444 .2990798263080405 .9542280951091057445 .9595715130819845 .281464937925758446 .479493757660153 .8775452902072612447 .778816512381476 .6272518154951441448 .10717242495680884 .9942404494531879449 .9825393022874412 .18605515166344666450 .5631993440138341 .8263210628456635451 .836547727223512 .5478940591731002452 .20410896609281687 .9789481753190622453 .9273625256504011 .374164062971458454 .39117038430225387 .9203182767091106455 .7135848687807936 .7005687939432483456 .00920375478205982 .9999576445519639457 .9999576445519639 .00920375478205982458 .7005687939432483 .7135848687807936459 .9203182767091106 .39117038430225387460 .374164062971458 .9273625256504011461 .9789481753190622 .20410896609281687462 .5478940591731002 .836547727223512463 .8263210628456635 .5631993440138341464 .18605515166344666 .9825393022874412465 .9942404494531879 .10717242495680884466 .6272518154951441 .778816512381476467 .8775452902072612 .479493757660153468 .281464937925758 .9595715130819845469 .9542280951091057 .2990798263080405470 .4632597835518602 .8862225301488806471 .7671389119358204 .6414810128085832472 .0888535525825246 .996044700901252473 .9983015449338929 .05825826450043576474 .6647109782033449 .7471006059801801475 .9000158920161603 .4358570799222555476 .32820984357909255 .9446048372614803477 .9677538370934755 .25189781815421697478 .5061866453451553 .8624239561110405479 .7976908409433912 .6030665985403482480 .13762012158648604 .9904850842564571481 .9877841416445722 .15582839765426523482 .5882815482226453 .808656181588175483 .8529606049303636 .5219752929371544484 .23404195858354343 .9722264970789363485 .9384035340631081 .34554132496398904486 .41921688836322396 .9078861164876663487 .7347388780959635 .6783500431298615488 .03987292758773981 .9992047586183639489 .9994306045554617 .03374117185137759490 .6828455463852481 .7305627692278276491 .9104412922580672 .41363831223843456492 .35129275608556715 .9362656671702783493 .973644249650812 .22807208317088573494 .5271991347819014 .8497417680008524495 .8122505865852039 .5833086529376983496 .16188639378011183 .9868094018141855497 .9913108598461154 .13154002870288312498 .6079497849677736 .7939754775543372499 .8655136240905691 .5008853826112408500 .257831102162159 .9661900034454125501 .9466009130832835 .32240767880106985502 .44137126873171667 .8973245807054183503 .7511651319096864 .6601143420674205504 .06438263092985747 .997925286198596505 .9965711457905548 .08274026454937569506 .6461760129833164 .7631884172633813507 .8890483558546646 .45781330359887723508 .30492922973540243 .9523750127197659509 .9612804858113206 .27557181931095814510 .4848692480007911 .8745866522781761511 .7826505961665757 .62246127937415512 .11327095217756435 .9935641355205953513 .9836624192117303 .18002290140569951514 .5682589526701316 .8228497813758263515 .8398937941959995 .5427507848645159516 .2101118368804696 .9776773578245099517 .9296408958431812 .3684668299533723518 .3968099874167103 .9179007756213905519 .7178700450557317 .696177131491463520 .015339206284988102 .9998823474542126521 .9997694053512153 .021474080275469508522 .6917592583641577 .7221281939292153523 .9154487160882678 .40243465085941843524 .3627557243673972 .9318842655816681525 .9763697313300211 .21610679707621952526 .5375870762956455 .8432082396418454527 .819347520076797 .5732971666980422528 .17398387338746382 .9847485018019042529 .9928504144598651 .11936521481099137530 .617647307937804 .7864552135990858531 .8715950866559511 .49022648328829116532 .2696683255729151 .9629532668736839533 .9504860739494817 .3107671527496115534 .4523495872337709 .8918407093923427535 .7592091889783881 .6508466849963809536 .07662386139203149 .997060070339483537 .9975114561403035 .07050457338961387538 .6554928529996153 .7552013768965365539 .8945994856313827 .4468688401623742540 .31659337555616585 .9485613499157303541 .9645897932898128 .2637546789748314542 .49556526182577254 .8685707059713409543 .79023022143731 .6128100824294097544 .12545498341154623 .9920993131421918545 .9857975091675675 .16793829497473117546 .5783137964116556 .8158144108067338547 .8464909387740521 .532403127877198548 .22209362097320354 .9750253450669941549 .9340925504042589 .35703096123343003550 .4080441628649787 .9129621904283982551 .726359155084346 .6873153408917592552 .027608145778965743 .9996188224951786553 .9989412931868569 .04600318213091463554 .673829000378756 .7388873244606151555 .9052967593181188 .4247796812091088556 .33977688440682685 .9405060705932683557 .9707721407289504 .2400030224487415558 .5167317990176499 .8561473283751945559 .8050313311429635 .5932322950397998560 .1497645346773215 .9887216919603238561 .9896220174632009 .14369503315029444562 .5981607069963423 .8013761717231402563 .8593018183570084 .5114688504379704564 .24595505033579462 .9692812353565485565 .9425731976014469 .3339996514420094566 .4303264813400826 .9026733182372588567 .7430079521351217 .6692825883466361568 .052131704680283324 .9986402181802653569 .9954807554919269 .094963495329639570 .6367618612362842 .7710605242618138571 .8833633386657316 .46868882203582796572 .29321916269425863 .9560452513499964573 .9578264130275329 .2873474595447295574 .47410021465055 .8804708890521608575 .7749531065948739 .6320187359398091576 .10106986275482782 .9948793307948056577 .9813791933137546 .19208039704989244578 .5581185312205561 .829761233794523579 .8331701647019132 .5530167055800276580 .1980984107179536 .9801821359681174581 .9250492407826776 .37984720892405116582 .38551605384391885 .9227011283338785583 .7092728264388657 .7049340803759049584 .003067956762965976 .9999952938095762585 )))586587(define med-lut588 (list->f64vector '(1. 0.589 .9999999999820472 5.9921124526424275e-6590 .9999999999281892 1.1984224905069707e-5591 .9999999998384257 1.7976337357066685e-5592 .9999999997127567 2.396844980841822e-5593 .9999999995511824 2.9960562258909154e-5594 .9999999993537025 3.5952674708324344e-5595 .9999999991203175 4.1944787156448635e-5596 .9999999988510269 4.793689960306688e-5597 .9999999985458309 5.3929012047963936e-5598 .9999999982047294 5.992112449092465e-5599 .9999999978277226 6.591323693173387e-5600 .9999999974148104 7.190534937017645e-5601 .9999999969659927 7.789746180603723e-5602 .9999999964812697 8.388957423910108e-5603 .9999999959606412 8.988168666915283e-5604 .9999999954041073 9.587379909597734e-5605 .999999994811668 1.0186591151935948e-4606 .9999999941833233 1.0785802393908407e-4607 .9999999935190732 1.1385013635493597e-4608 .9999999928189177 1.1984224876670004e-4609 .9999999920828567 1.2583436117416112e-4610 .9999999913108903 1.3182647357710405e-4611 .9999999905030187 1.3781858597531374e-4612 .9999999896592414 1.4381069836857496e-4613 .9999999887795589 1.498028107566726e-4614 .9999999878639709 1.5579492313939151e-4615 .9999999869124775 1.6178703551651655e-4616 .9999999859250787 1.6777914788783258e-4617 .9999999849017744 1.737712602531244e-4618 .9999999838425648 1.797633726121769e-4619 .9999999827474497 1.8575548496477492e-4620 .9999999816164293 1.9174759731070332e-4621 .9999999804495034 1.9773970964974692e-4622 .9999999792466722 2.037318219816906e-4623 .9999999780079355 2.0972393430631923e-4624 .9999999767332933 2.1571604662341763e-4625 .9999999754227459 2.2170815893277063e-4626 .9999999740762929 2.2770027123416315e-4627 .9999999726939346 2.3369238352737996e-4628 .9999999712756709 2.3968449581220595e-4629 .9999999698215016 2.45676608088426e-4630 .9999999683314271 2.5166872035582493e-4631 .9999999668054471 2.5766083261418755e-4632 .9999999652435617 2.636529448632988e-4633 .9999999636457709 2.696450571029434e-4634 .9999999620120748 2.756371693329064e-4635 .9999999603424731 2.8162928155297243e-4636 .9999999586369661 2.876213937629265e-4637 .9999999568955537 2.936135059625534e-4638 .9999999551182358 2.99605618151638e-4639 .9999999533050126 3.055977303299651e-4640 .9999999514558838 3.115898424973196e-4641 .9999999495708498 3.1758195465348636e-4642 .9999999476499103 3.235740667982502e-4643 .9999999456930654 3.2956617893139595e-4644 .9999999437003151 3.3555829105270853e-4645 .9999999416716594 3.4155040316197275e-4646 .9999999396070982 3.475425152589734e-4647 .9999999375066316 3.535346273434955e-4648 .9999999353702598 3.595267394153237e-4649 .9999999331979824 3.6551885147424295e-4650 .9999999309897996 3.7151096352003814e-4651 .9999999287457114 3.7750307555249406e-4652 .9999999264657179 3.8349518757139556e-4653 .9999999241498189 3.8948729957652753e-4654 .9999999217980144 3.954794115676748e-4655 .9999999194103046 4.0147152354462224e-4656 .9999999169866894 4.0746363550715466e-4657 .9999999145271687 4.134557474550569e-4658 .9999999120317428 4.194478593881139e-4659 .9999999095004113 4.2543997130611036e-4660 .9999999069331744 4.314320832088313e-4661 .9999999043300322 4.3742419509606144e-4662 .9999999016909845 4.4341630696758576e-4663 .9999998990160315 4.4940841882318896e-4664 .9999998963051729 4.55400530662656e-4665 .999999893558409 4.613926424857717e-4666 .9999998907757398 4.673847542923209e-4667 .9999998879571651 4.7337686608208844e-4668 .9999998851026849 4.793689778548592e-4669 .9999998822122994 4.8536108961041806e-4670 .9999998792860085 4.913532013485497e-4671 .9999998763238122 4.973453130690393e-4672 .9999998733257104 5.033374247716714e-4673 .9999998702917032 5.09329536456231e-4674 .9999998672217907 5.153216481225028e-4675 .9999998641159727 5.213137597702719e-4676 .9999998609742493 5.27305871399323e-4677 .9999998577966206 5.332979830094408e-4678 .9999998545830864 5.392900946004105e-4679 .9999998513336468 5.452822061720168e-4680 .9999998480483018 5.512743177240444e-4681 .9999998447270514 5.572664292562783e-4682 .9999998413698955 5.632585407685033e-4683 .9999998379768343 5.692506522605043e-4684 .9999998345478677 5.752427637320661e-4685 .9999998310829956 5.812348751829735e-4686 .9999998275822183 5.872269866130116e-4687 .9999998240455354 5.93219098021965e-4688 .9999998204729471 5.992112094096185e-4689 .9999998168644535 6.052033207757572e-4690 .9999998132200545 6.111954321201659e-4691 .99999980953975 6.171875434426292e-4692 .9999998058235401 6.231796547429323e-4693 .9999998020714248 6.291717660208597e-4694 .9999997982834041 6.351638772761965e-4695 .9999997944594781 6.411559885087275e-4696 .9999997905996466 6.471480997182375e-4697 .9999997867039097 6.531402109045114e-4698 .9999997827722674 6.591323220673341e-4699 .9999997788047197 6.651244332064902e-4700 .9999997748012666 6.711165443217649e-4701 .9999997707619082 6.771086554129428e-4702 .9999997666866443 6.83100766479809e-4703 .9999997625754748 6.89092877522148e-4704 .9999997584284002 6.950849885397449e-4705 .9999997542454201 7.010770995323844e-4706 .9999997500265345 7.070692104998515e-4707 .9999997457717437 7.130613214419311e-4708 .9999997414810473 7.190534323584079e-4709 .9999997371544456 7.250455432490666e-4710 .9999997327919384 7.310376541136925e-4711 .9999997283935259 7.3702976495207e-4712 .999999723959208 7.430218757639842e-4713 .9999997194889846 7.490139865492199e-4714 .9999997149828559 7.55006097307562e-4715 .9999997104408218 7.609982080387952e-4716 .9999997058628822 7.669903187427045e-4717 .9999997012490373 7.729824294190747e-4718 .9999996965992869 7.789745400676906e-4719 .9999996919136313 7.849666506883372e-4720 .99999968719207 7.909587612807992e-4721 .9999996824346035 7.969508718448614e-4722 .9999996776412315 8.029429823803089e-4723 .9999996728119542 8.089350928869263e-4724 .9999996679467715 8.149272033644986e-4725 .9999996630456833 8.209193138128106e-4726 .9999996581086897 8.269114242316472e-4727 .9999996531357909 8.329035346207931e-4728 .9999996481269865 8.388956449800333e-4729 .9999996430822767 8.448877553091527e-4730 .9999996380016616 8.508798656079359e-4731 .999999632885141 8.56871975876168e-4732 .9999996277327151 8.628640861136338e-4733 .9999996225443838 8.68856196320118e-4734 .9999996173201471 8.748483064954056e-4735 .999999612060005 8.808404166392814e-4736 .9999996067639574 8.868325267515304e-4737 .9999996014320045 8.928246368319371e-4738 .9999995960641462 8.988167468802867e-4739 .9999995906603825 9.048088568963639e-4740 .9999995852207133 9.108009668799535e-4741 .9999995797451389 9.167930768308405e-4742 .9999995742336589 9.227851867488095e-4743 .9999995686862736 9.287772966336457e-4744 .9999995631029829 9.347694064851338e-4745 .9999995574837868 9.407615163030585e-4746 .9999995518286853 9.467536260872047e-4747 .9999995461376784 9.527457358373575e-4748 .9999995404107661 9.587378455533015e-4749 .9999995346479484 9.647299552348216e-4750 .9999995288492254 9.707220648817027e-4751 .9999995230145969 9.767141744937296e-4752 .9999995171440631 9.827062840706872e-4753 .9999995112376238 9.886983936123602e-4754 .9999995052952791 9.946905031185337e-4755 .9999994993170291 .0010006826125889925756 .9999994933028736 .0010066747220235214757 .9999994872528128 .001012666831421905758 .9999994811668466 .0010186589407839286759 .999999475044975 .0010246510501093766760 .9999994688871979 .0010306431593980344761 .9999994626935156 .0010366352686496862762 .9999994564639277 .0010426273778641173763 .9999994501984345 .0010486194870411127764 .999999443897036 .0010546115961804568765 .999999437559732 .0010606037052819344766 .9999994311865227 .0010665958143453308767 .9999994247774079 .0010725879233704307768 .9999994183323877 .0010785800323570187769 .9999994118514622 .0010845721413048801770 .9999994053346313 .0010905642502137994771 .9999993987818949 .0010965563590835613772 .9999993921932533 .0011025484679139511773 .9999993855687062 .0011085405767047535774 .9999993789082536 .0011145326854557532775 .9999993722118957 .001120524794166735776 .9999993654796325 .0011265169028374842777 .9999993587114638 .0011325090114677853778 .9999993519073898 .001138501120057423779 .9999993450674104 .0011444932286061825780 .9999993381915255 .0011504853371138485781 .9999993312797354 .0011564774455802057782 .9999993243320398 .0011624695540050393783 .9999993173484387 .001168461662388134784 .9999993103289324 .0011744537707292742785 .9999993032735206 .0011804458790282454786 .9999992961822035 .0011864379872848323787 .9999992890549809 .0011924300954988195788 .999999281891853 .001198422203669992789 .9999992746928197 .0012044143117981348790 .999999267457881 .0012104064198830327791 .999999260187037 .0012163985279244702792 .9999992528802875 .0012223906359222325793 .9999992455376326 .0012283827438761045794 .9999992381590724 .0012343748517858707795 .9999992307446068 .0012403669596513162796 .9999992232942359 .001246359067472226797 .9999992158079595 .0012523511752483847798 .9999992082857777 .001258343282979577799 .9999992007276906 .001264335390665588800 .999999193133698 .0012703274983062026801 .9999991855038001 .0012763196059012057802 .9999991778379967 .001282311713450382803 .9999991701362881 .0012883038209535163804 .999999162398674 .0012942959284103935805 .9999991546251547 .0013002880358207985806 .9999991468157298 .001306280143184516807 .9999991389703996 .001312272250501331808 .999999131089164 .0013182643577710285809 .999999123172023 .0013242564649933932810 .9999991152189767 .0013302485721682098811 .9999991072300249 .001336240679295263812 .9999990992051678 .0013422327863743383813 .9999990911444054 .0013482248934052201814 .9999990830477375 .0013542170003876934815 .9999990749151643 .001360209107321543816 .9999990667466857 .0013662012142065536817 .9999990585423016 .0013721933210425101818 .9999990503020123 .0013781854278291975819 .9999990420258176 .0013841775345664006820 .9999990337137175 .0013901696412539043821 .999999025365712 .0013961617478914935822 .999999016981801 .0014021538544789526823 .9999990085619848 .001408145961016067824 .9999990001062631 .0014141380675026214825 .9999989916146361 .0014201301739384005826 .9999989830871038 .0014261222803231893827 .9999989745236659 .0014321143866567725828 .9999989659243228 .001438106492938935829 .9999989572890743 .0014440985991694619830 .9999989486179204 .0014500907053481378831 .9999989399108612 .0014560828114747475832 .9999989311678965 .0014620749175490758833 .9999989223890265 .001468067023570908834 .9999989135742512 .0014740591295400284835 .9999989047235704 .0014800512354562223836 .9999988958369843 .0014860433413192743837 .9999988869144928 .0014920354471289693838 .9999988779560959 .0014980275528850922839 .9999988689617937 .0015040196585874275840 .9999988599315861 .0015100117642357607841 .999998850865473 .0015160038698298762842 .9999988417634548 .001521995975369559843 .999998832625531 .0015279880808545937844 .9999988234517019 .0015339801862847657845 .9999988142419675 .0015399722916598592846 .9999988049963277 .0015459643969796596847 .9999987957147825 .0015519565022439512848 .9999987863973319 .0015579486074525195849 .9999987770439759 .001563940712605149850 .9999987676547146 .0015699328177016243851 .999998758229548 .0015759249227417307852 .9999987487684759 .0015819170277252528853 .9999987392714985 .0015879091326519755854 .9999987297386157 .0015939012375216837855 .9999987201698276 .0015998933423341623856 .9999987105651341 .001605885447089196857 .9999987009245352 .0016118775517865696858 .999998691248031 .0016178696564260683859 .9999986815356214 .0016238617610074765860 .9999986717873064 .0016298538655305794861 .9999986620030861 .0016358459699951618862 .9999986521829605 .0016418380744010084863 .9999986423269294 .0016478301787479041864 .999998632434993 .0016538222830356339865 .9999986225071512 .0016598143872639823866 .999998612543404 .0016658064914327345867 .9999986025437515 .0016717985955416754868 .9999985925081937 .0016777906995905894869 .9999985824367305 .0016837828035792617870 .9999985723293618 .0016897749075074774871 .999998562186088 .0016957670113750207872 .9999985520069086 .0017017591151816769873 .9999985417918239 .0017077512189272307874 .999998531540834 .001713743322611467875 .9999985212539385 .0017197354262341706876 .9999985109311378 .0017257275297951264877 .9999985005724317 .0017317196332941192878 .9999984901778203 .0017377117367309341879 .9999984797473034 .0017437038401053556880 .9999984692808812 .0017496959434171687881 .9999984587785538 .0017556880466661582882 .9999984482403208 .001761680149852109883 .9999984376661826 .0017676722529748061884 .999998427056139 .0017736643560340342885 .99999841641019 .001779656459029578886 .9999984057283358 .0017856485619612225887 .9999983950105761 .0017916406648287528888 .999998384256911 .0017976327676319532889 .9999983734673407 .001803624870370609890 .9999983626418649 .0018096169730445048891 .9999983517804839 .0018156090756534257892 .9999983408831975 .0018216011781971562893 .9999983299500057 .0018275932806754815894 .9999983189809085 .0018335853830881864895 .999998307975906 .0018395774854350557896 .9999982969349982 .001845569587715874897 .9999982858581851 .0018515616899304264898 .9999982747454665 .001857553792078498899 .9999982635968426 .001863545894159873900 .9999982524123134 .0018695379961743367901 .9999982411918789 .001875530098121674902 .9999982299355389 .0018815222000016696903 .9999982186432936 .0018875143018141083904 .999998207315143 .0018935064035587748905 .999998195951087 .0018994985052354545906 .9999981845511257 .0019054906068439318907 .9999981731152591 .0019114827083839918908 .999998161643487 .001917474809855419909 .9999981501358096 .0019234669112579987910 .999998138592227 .0019294590125915154911 .9999981270127389 .0019354511138557542912 .9999981153973455 .0019414432150504997913 .9999981037460468 .0019474353161755369914 .9999980920588427 .001953427417230651915 .9999980803357332 .001959419518215626916 .9999980685767185 .0019654116191302473917 .9999980567817984 .0019714037199743918 .9999980449509729 .0019773958207475683919 .9999980330842422 .0019833879214498375920 .999998021181606 .001989380022080892921 .9999980092430646 .0019953721226405176922 .9999979972686177 .002001364223128498923 .9999979852582656 .002007356323544619924 .9999979732120081 .002013348423888665925 .9999979611298453 .002019340524160421926 .9999979490117771 .0020253326243596715927 .9999979368578036 .0020313247244862017928 .9999979246679247 .002037316824539796929 .9999979124421405 .00204330892452024930 .999997900180451 .002049301024427318931 .9999978878828562 .0020552931242608153932 .9999978755493559 .002061285224020516933 .9999978631799504 .0020672773237062057934 .9999978507746395 .002073269423317669935 .9999978383334234 .0020792615228546903936 .9999978258563018 .002085253622317055937 .999997813343275 .0020912457217045484938 .9999978007943428 .002097237821016954939 .9999977882095052 .0021032299202540577940 .9999977755887623 .0021092220194156444941 .9999977629321142 .0021152141185014984942 .9999977502395607 .0021212062175114043943 .9999977375111019 .002127198316445148944 .9999977247467376 .0021331904153025134945 .9999977119464681 .002139182514083286946 .9999976991102932 .0021451746127872503947 .9999976862382131 .002151166711414191948 .9999976733302276 .0021571588099638934949 .9999976603863368 .0021631509084361423950 .9999976474065406 .002169143006830722951 .9999976343908391 .002175135105147418952 .9999976213392323 .0021811272033860148953 .9999976082517201 .002187119301546297954 .9999975951283027 .00219311139962805955 .9999975819689799 .0021991034976310588956 .9999975687737518 .0022050955955551076957 .9999975555426184 .0022110876933999816958 .9999975422755796 .0022170797911654654959 .9999975289726355 .002223071888851344960 .9999975156337861 .0022290639864574026961 .9999975022590314 .0022350560839834253962 .9999974888483714 .002241048181429198963 .999997475401806 .0022470402787945045964 .9999974619193353 .00225303237607913965 .9999974484009593 .0022590244732828596966 .9999974348466779 .0022650165704054784967 .9999974212564913 .0022710086674467703968 .9999974076303992 .002277000764406521969 .9999973939684019 .002282992861284515970 .9999973802704993 .0022889849580805368971 .9999973665366915 .0022949770547943723972 .9999973527669782 .0023009691514258054973 .9999973389613596 .002306961247974621974 .9999973251198357 .0023129533444406045975 .9999973112424065 .0023189454408235406976 .999997297329072 .0023249375371232135977 .9999972833798322 .002330929633339409978 .999997269394687 .0023369217294719113979 .9999972553736366 .0023429138255205055980 .9999972413166809 .0023489059214849765981 .9999972272238198 .002354898017365109982 .9999972130950534 .0023608901131606883983 .9999971989303816 .0023668822088714985984 .9999971847298047 .0023728743044973246985 .9999971704933224 .0023788664000379523986 .9999971562209347 .0023848584954931653987 .9999971419126418 .0023908505908627493988 .9999971275684435 .0023968426861464883989 .99999711318834 .002402834781344168990 .9999970987723311 .0024088268764555732991 .9999970843204169 .002414818971480488992 .9999970698325974 .002420811066418698993 .9999970553088726 .0024268031612699878994 .9999970407492426 .002432795256034142995 .9999970261537071 .002438787350710946996 .9999970115222664 .002444779445300184997 .9999969968549204 .0024507715398016418998 .9999969821516691 .002456763634215103999 .9999969674125124 .0024627557285403531000 .9999969526374506 .00246874782277717741001 .9999969378264834 .002474739916925361002 .9999969229796108 .0024807320109846861003 .999996908096833 .00248672410495494061004 .9999968931781499 .0024927161988359081005 .9999968782235614 .00249870829262737341006 .9999968632330677 .0025047003863291221007 .9999968482066687 .0025106924799409381008 .9999968331443644 .00251668457346260681009 .9999968180461547 .00252267666689391271010 .9999968029120399 .0025286687602346411011 .9999967877420196 .0025346608534845761012 .9999967725360941 .00254065294664350361013 .9999967572942633 .0025466450397112081014 .9999967420165272 .0025526371326874741015 .9999967267028858 .0025586292255720861016 .9999967113533391 .00256462131836482971017 .9999966959678871 .00257061341106548961018 .9999966805465298 .0025766055036738511019 .9999966650892672 .00258259759618969771020 .9999966495960994 .00258858968861281531021 .9999966340670262 .00259458178094298851022 .9999966185020478 .00260057387318000241023 .9999966029011641 .00260656596532364171024 .999996587264375 .0026125580573736911025 .9999965715916808 .0026185501493299351026 .9999965558830811 .00262454224119215921027 .9999965401385762 .0026305343329601481028 .9999965243581661 .0026365264246336871029 .9999965085418506 .00264251851621255961030 .9999964926896299 .00264851060769655171031 .9999964768015038 .00265450269908544841032 .9999964608774725 .00266049479037903371033 .9999964449175359 .00266648688157709261034 .999996428921694 .00267247897267941041035 .9999964128899468 .0026784710636857721036 .9999963968222944 .00268446315459596171037 .9999963807187366 .0026904552454097651038 .9999963645792737 .0026964473361269661039 .9999963484039053 .002702439426747351040 .9999963321926317 .0027084315172707021041 .9999963159454529 .00271442360769680661042 .9999962996623687 .00272041569802544851043 .9999962833433793 .0027264077882564131044 .9999962669884847 .0027323998783894851045 .9999962505976846 .00273839196842444841046 .9999962341709794 .0027443840583610891047 .9999962177083689 .00275037614819919131048 .999996201209853 .00275636823793854031049 .9999961846754319 .00276236032757892071050 .9999961681051056 .00276835241712011751051 .999996151498874 .0027743445065619151052 .9999961348567371 .0027803365959040991053 .9999961181786949 .00278632868514645371054 .9999961014647475 .00279232077428876421055 .9999960847148948 .00279831286333081551056 .9999960679291368 .0028043049522723921057 .9999960511074735 .0028102970411132791058 .9999960342499049 .00281628912985326061059 .9999960173564312 .00282228121849212271060 .9999960004270521 .0028282733070296491061 .9999959834617678 .0028342653954656261062 .9999959664605781 .00284025748379983671063 .9999959494234832 .0028462495720320671064 .9999959323504831 .00285224166016210141065 .9999959152415777 .0028582337481897251066 .999995898096767 .0028642258361147231067 .9999958809160512 .00287021792393687931068 .9999958636994299 .00287621001165597931069 .9999958464469034 .00288220209927180771070 .9999958291584717 .00288819418678414951071 .9999958118341348 .00289418627419278951072 .9999957944738925 .00290017836149751271073 .999995777077745 .0029061704486981041074 .9999957596456922 .00291216253579434751075 .9999957421777342 .0029181546227860291076 .999995724673871 .00292414670967293271077 .9999957071341024 .0029301387964548441078 .9999956895584287 .00293613088313154741079 .9999956719468496 .00294212296970282731080 .9999956542993652 .00294811505616846951081 .9999956366159757 .00295410714252825841082 .9999956188966809 .0029600992287819791083 .9999956011414808 .0029660913149294161084 .9999955833503754 .0029720834009703541085 .9999955655233649 .00297807548690457851086 .9999955476604491 .00298406757273187361087 .999995529761628 .0029900596584520251088 .9999955118269016 .00299605174406481631089 .99999549385627 .00300204382957003361090 .9999954758497331 .00300803591496746121091 .999995457807291 .0030140280002568841092 .9999954397289438 .0030200200854380871093 .9999954216146911 .00302601217051085521094 .9999954034645333 .0030320042554749731095 .9999953852784702 .0030379963403302251096 .9999953670565019 .0030439884250763971097 .9999953487986284 .0030499805097132731098 .9999953305048496 .00305597259424063861099 .9999953121751655 .0030619646786582781100 )))110111021103(define high-lut1104 (list->f64vector '(1. 0.1105 .9999999999999999 1.1703344634137277e-81106 .9999999999999998 2.3406689268274554e-81107 .9999999999999993 3.5110033902411824e-81108 .9999999999999989 4.6813378536549095e-81109 .9999999999999983 5.851672317068635e-81110 .9999999999999976 7.022006780482361e-81111 .9999999999999967 8.192341243896085e-81112 .9999999999999957 9.362675707309808e-81113 .9999999999999944 1.0533010170723531e-71114 .9999999999999931 1.170334463413725e-71115 .9999999999999917 1.287367909755097e-71116 .9999999999999901 1.4044013560964687e-71117 .9999999999999885 1.5214348024378403e-71118 .9999999999999866 1.6384682487792116e-71119 .9999999999999846 1.7555016951205827e-71120 .9999999999999825 1.8725351414619535e-71121 .9999999999999802 1.989568587803324e-71122 .9999999999999778 2.1066020341446942e-71123 .9999999999999752 2.2236354804860645e-71124 .9999999999999726 2.3406689268274342e-71125 .9999999999999698 2.4577023731688034e-71126 .9999999999999668 2.5747358195101726e-71127 .9999999999999638 2.6917692658515413e-71128 .9999999999999606 2.8088027121929094e-71129 .9999999999999571 2.9258361585342776e-71130 .9999999999999537 3.042869604875645e-71131 .99999999999995 3.159903051217012e-71132 .9999999999999463 3.276936497558379e-71133 .9999999999999424 3.3939699438997453e-71134 .9999999999999384 3.5110033902411114e-71135 .9999999999999342 3.6280368365824763e-71136 .9999999999999298 3.7450702829238413e-71137 .9999999999999254 3.8621037292652057e-71138 .9999999999999208 3.979137175606569e-71139 .9999999999999161 4.0961706219479325e-71140 .9999999999999113 4.2132040682892953e-71141 .9999999999999063 4.330237514630657e-71142 .9999999999999011 4.447270960972019e-71143 .9999999999998959 4.5643044073133796e-71144 .9999999999998904 4.68133785365474e-71145 .9999999999998849 4.7983712999961e-71146 .9999999999998792 4.915404746337459e-71147 .9999999999998733 5.032438192678817e-71148 .9999999999998674 5.149471639020175e-71149 .9999999999998613 5.266505085361531e-71150 .9999999999998551 5.383538531702888e-71151 .9999999999998487 5.500571978044243e-71152 .9999999999998422 5.617605424385598e-71153 .9999999999998356 5.734638870726952e-71154 .9999999999998288 5.851672317068305e-71155 .9999999999998219 5.968705763409657e-71156 .9999999999998148 6.085739209751009e-71157 .9999999999998076 6.202772656092359e-71158 .9999999999998003 6.319806102433709e-71159 .9999999999997928 6.436839548775058e-71160 .9999999999997853 6.553872995116406e-71161 .9999999999997775 6.670906441457753e-71162 .9999999999997696 6.7879398877991e-71163 .9999999999997616 6.904973334140445e-71164 .9999999999997534 7.02200678048179e-71165 .9999999999997452 7.139040226823132e-71166 .9999999999997368 7.256073673164475e-71167 .9999999999997282 7.373107119505817e-71168 .9999999999997194 7.490140565847157e-71169 .9999999999997107 7.607174012188497e-71170 .9999999999997017 7.724207458529835e-71171 .9999999999996926 7.841240904871172e-71172 .9999999999996834 7.958274351212508e-71173 .9999999999996739 8.075307797553844e-71174 .9999999999996644 8.192341243895178e-71175 .9999999999996547 8.309374690236511e-71176 .999999999999645 8.426408136577842e-71177 .9999999999996351 8.543441582919173e-71178 .999999999999625 8.660475029260503e-71179 .9999999999996148 8.777508475601831e-71180 .9999999999996044 8.894541921943158e-71181 .999999999999594 9.011575368284484e-71182 .9999999999995833 9.128608814625808e-71183 .9999999999995726 9.245642260967132e-71184 .9999999999995617 9.362675707308454e-71185 .9999999999995507 9.479709153649775e-71186 .9999999999995395 9.596742599991095e-71187 .9999999999995283 9.713776046332412e-71188 .9999999999995168 9.83080949267373e-71189 .9999999999995052 9.947842939015044e-71190 .9999999999994935 1.006487638535636e-61191 .9999999999994816 1.0181909831697673e-61192 .9999999999994696 1.0298943278038984e-61193 .9999999999994575 1.0415976724380293e-61194 .9999999999994453 1.0533010170721601e-61195 .9999999999994329 1.065004361706291e-61196 .9999999999994204 1.0767077063404215e-61197 .9999999999994077 1.088411050974552e-61198 .9999999999993949 1.1001143956086822e-61199 .9999999999993819 1.1118177402428122e-61200 .9999999999993688 1.1235210848769423e-61201 .9999999999993556 1.135224429511072e-61202 .9999999999993423 1.1469277741452017e-61203 .9999999999993288 1.1586311187793313e-61204 .9999999999993151 1.1703344634134605e-61205 .9999999999993014 1.1820378080475897e-61206 .9999999999992875 1.1937411526817187e-61207 .9999999999992735 1.2054444973158477e-61208 .9999999999992593 1.2171478419499764e-61209 .9999999999992449 1.2288511865841048e-61210 .9999999999992305 1.2405545312182331e-61211 .999999999999216 1.2522578758523615e-61212 .9999999999992012 1.2639612204864894e-61213 .9999999999991863 1.2756645651206173e-61214 .9999999999991713 1.287367909754745e-61215 .9999999999991562 1.2990712543888725e-61216 .9999999999991409 1.3107745990229998e-61217 .9999999999991255 1.3224779436571269e-61218 .9999999999991099 1.3341812882912537e-61219 .9999999999990943 1.3458846329253806e-61220 .9999999999990785 1.3575879775595072e-61221 .9999999999990625 1.3692913221936337e-61222 .9999999999990464 1.3809946668277597e-61223 .9999999999990302 1.3926980114618857e-61224 .9999999999990138 1.4044013560960117e-61225 .9999999999989974 1.4161047007301373e-61226 .9999999999989807 1.4278080453642627e-61227 .9999999999989639 1.439511389998388e-61228 .999999999998947 1.451214734632513e-61229 .99999999999893 1.462918079266638e-61230 .9999999999989128 1.4746214239007625e-61231 .9999999999988954 1.486324768534887e-61232 .999999999998878 1.4980281131690111e-61233 .9999999999988604 1.5097314578031353e-61234 .9999999999988426 1.5214348024372591e-61235 .9999999999988247 1.5331381470713828e-61236 .9999999999988067 1.544841491705506e-61237 .9999999999987886 1.5565448363396294e-61238 .9999999999987703 1.5682481809737524e-61239 .9999999999987519 1.579951525607875e-61240 .9999999999987333 1.5916548702419977e-61241 .9999999999987146 1.60335821487612e-61242 .9999999999986958 1.615061559510242e-61243 .9999999999986768 1.626764904144364e-61244 .9999999999986577 1.6384682487784858e-61245 .9999999999986384 1.6501715934126072e-61246 .9999999999986191 1.6618749380467283e-61247 .9999999999985996 1.6735782826808495e-61248 .9999999999985799 1.6852816273149702e-61249 .9999999999985602 1.6969849719490907e-61250 .9999999999985402 1.708688316583211e-61251 .9999999999985201 1.720391661217331e-61252 .9999999999985 1.732095005851451e-61253 .9999999999984795 1.7437983504855706e-61254 .9999999999984591 1.7555016951196899e-61255 .9999999999984385 1.767205039753809e-61256 .9999999999984177 1.778908384387928e-61257 .9999999999983968 1.7906117290220465e-61258 .9999999999983759 1.802315073656165e-61259 .9999999999983546 1.814018418290283e-61260 .9999999999983333 1.825721762924401e-61261 .9999999999983119 1.8374251075585186e-61262 .9999999999982904 1.8491284521926361e-61263 .9999999999982686 1.8608317968267533e-61264 .9999999999982468 1.8725351414608702e-61265 .9999999999982249 1.8842384860949866e-61266 .9999999999982027 1.8959418307291031e-61267 .9999999999981805 1.9076451753632194e-61268 .999999999998158 1.919348519997335e-61269 .9999999999981355 1.9310518646314507e-61270 .9999999999981128 1.942755209265566e-61271 .9999999999980901 1.954458553899681e-61272 .9999999999980671 1.966161898533796e-61273 .999999999998044 1.9778652431679103e-61274 .9999999999980208 1.9895685878020246e-61275 .9999999999979975 2.0012719324361386e-61276 .999999999997974 2.012975277070252e-61277 .9999999999979503 2.0246786217043656e-61278 .9999999999979265 2.0363819663384787e-61279 .9999999999979027 2.048085310972592e-61280 .9999999999978786 2.0597886556067045e-61281 .9999999999978545 2.0714920002408167e-61282 .9999999999978302 2.0831953448749286e-61283 .9999999999978058 2.0948986895090404e-61284 .9999999999977811 2.106602034143152e-61285 .9999999999977564 2.118305378777263e-61286 .9999999999977315 2.1300087234113738e-61287 .9999999999977065 2.1417120680454843e-61288 .9999999999976814 2.153415412679595e-61289 .9999999999976561 2.1651187573137046e-61290 .9999999999976307 2.1768221019478143e-61291 .9999999999976051 2.188525446581924e-61292 .9999999999975795 2.200228791216033e-61293 .9999999999975536 2.2119321358501417e-61294 .9999999999975278 2.22363548048425e-61295 .9999999999975017 2.2353388251183586e-61296 .9999999999974754 2.247042169752466e-61297 .999999999997449 2.2587455143865738e-61298 .9999999999974225 2.2704488590206814e-61299 .9999999999973959 2.282152203654788e-61300 .9999999999973691 2.293855548288895e-61301 .9999999999973422 2.305558892923001e-61302 .9999999999973151 2.317262237557107e-61303 .999999999997288 2.328965582191213e-61304 .9999999999972606 2.340668926825318e-61305 .9999999999972332 2.352372271459423e-61306 .9999999999972056 2.364075616093528e-61307 .9999999999971778 2.3757789607276323e-61308 .99999999999715 2.3874823053617365e-61309 .999999999997122 2.3991856499958403e-61310 .9999999999970938 2.4108889946299437e-61311 .9999999999970656 2.4225923392640466e-61312 .9999999999970371 2.4342956838981495e-61313 .9999999999970085 2.445999028532252e-61314 .9999999999969799 2.457702373166354e-61315 .999999999996951 2.4694057178004558e-61316 .999999999996922 2.4811090624345574e-61317 .9999999999968929 2.4928124070686583e-61318 .9999999999968637 2.504515751702759e-61319 .9999999999968343 2.5162190963368595e-61320 .9999999999968048 2.5279224409709594e-61321 .9999999999967751 2.5396257856050594e-61322 .9999999999967454 2.5513291302391585e-61323 .9999999999967154 2.5630324748732576e-61324 .9999999999966853 2.5747358195073563e-61325 .9999999999966551 2.5864391641414546e-61326 .9999999999966248 2.5981425087755525e-61327 .9999999999965944 2.6098458534096503e-61328 .9999999999965637 2.6215491980437473e-61329 .999999999996533 2.6332525426778443e-61330 .9999999999965021 2.644955887311941e-61331 .999999999996471 2.656659231946037e-61332 .99999999999644 2.6683625765801328e-61333 .9999999999964087 2.680065921214228e-61334 .9999999999963772 2.6917692658483234e-61335 .9999999999963456 2.703472610482418e-61336 .999999999996314 2.7151759551165123e-61337 .9999999999962821 2.7268792997506064e-61338 .9999999999962501 2.7385826443846996e-61339 .9999999999962179 2.750285989018793e-61340 .9999999999961857 2.761989333652886e-61341 .9999999999961533 2.7736926782869783e-61342 .9999999999961208 2.78539602292107e-61343 .9999999999960881 2.797099367555162e-61344 .9999999999960553 2.808802712189253e-61345 .9999999999960224 2.8205060568233443e-61346 .9999999999959893 2.832209401457435e-61347 .9999999999959561 2.8439127460915247e-61348 .9999999999959227 2.8556160907256145e-61349 .9999999999958893 2.867319435359704e-61350 .9999999999958556 2.879022779993793e-61351 .9999999999958219 2.8907261246278814e-61352 .9999999999957879 2.90242946926197e-61353 .999999999995754 2.9141328138960576e-61354 .9999999999957198 2.925836158530145e-61355 .9999999999956855 2.9375395031642317e-61356 .999999999995651 2.9492428477983186e-61357 .9999999999956164 2.9609461924324046e-61358 .9999999999955816 2.9726495370664905e-61359 .9999999999955468 2.9843528817005757e-61360 .9999999999955118 2.996056226334661e-61361 .9999999999954767 3.007759570968745e-61362 .9999999999954414 3.0194629156028294e-61363 .999999999995406 3.0311662602369133e-61364 .9999999999953705 3.0428696048709963e-61365 .9999999999953348 3.0545729495050794e-61366 .999999999995299 3.066276294139162e-61367 .999999999995263 3.0779796387732437e-61368 .9999999999952269 3.0896829834073255e-61369 .9999999999951907 3.101386328041407e-61370 .9999999999951543 3.1130896726754873e-61371 .9999999999951178 3.1247930173095678e-61372 .9999999999950812 3.136496361943648e-61373 .9999999999950444 3.148199706577727e-61374 .9999999999950075 3.1599030512118063e-61375 .9999999999949705 3.171606395845885e-61376 .9999999999949333 3.183309740479963e-61377 .999999999994896 3.195013085114041e-61378 .9999999999948584 3.206716429748118e-61379 .9999999999948209 3.218419774382195e-61380 .9999999999947832 3.2301231190162714e-61381 .9999999999947453 3.2418264636503477e-61382 .9999999999947072 3.253529808284423e-61383 .9999999999946692 3.265233152918498e-61384 .9999999999946309 3.276936497552573e-61385 .9999999999945924 3.288639842186647e-61386 .9999999999945539 3.300343186820721e-61387 .9999999999945152 3.312046531454794e-61388 .9999999999944763 3.323749876088867e-61389 .9999999999944373 3.3354532207229395e-61390 .9999999999943983 3.3471565653570115e-61391 .9999999999943591 3.358859909991083e-61392 .9999999999943197 3.370563254625154e-61393 .9999999999942801 3.3822665992592245e-61394 .9999999999942405 3.3939699438932944e-61395 .9999999999942008 3.4056732885273643e-61396 .9999999999941608 3.4173766331614334e-61397 .9999999999941207 3.429079977795502e-61398 .9999999999940805 3.4407833224295702e-61399 .9999999999940402 3.452486667063638e-61400 .9999999999939997 3.4641900116977054e-61401 .999999999993959 3.4758933563317723e-61402 .9999999999939183 3.4875967009658384e-61403 .9999999999938775 3.4993000455999045e-61404 .9999999999938364 3.5110033902339697e-61405 .9999999999937953 3.5227067348680345e-61406 .999999999993754 3.534410079502099e-61407 .9999999999937126 3.546113424136163e-61408 .999999999993671 3.5578167687702264e-61409 .9999999999936293 3.5695201134042896e-61410 .9999999999935875 3.581223458038352e-61411 .9999999999935454 3.592926802672414e-61412 .9999999999935033 3.6046301473064755e-61413 .9999999999934611 3.6163334919405365e-61414 .9999999999934187 3.628036836574597e-61415 .9999999999933762 3.639740181208657e-61416 .9999999999933334 3.6514435258427166e-61417 .9999999999932907 3.6631468704767755e-61418 .9999999999932477 3.674850215110834e-61419 .9999999999932047 3.686553559744892e-61420 .9999999999931615 3.6982569043789496e-61421 .9999999999931181 3.7099602490130064e-61422 .9999999999930747 3.7216635936470627e-61423 .999999999993031 3.733366938281119e-61424 .9999999999929873 3.745070282915174e-61425 .9999999999929433 3.756773627549229e-61426 .9999999999928992 3.768476972183284e-61427 .9999999999928552 3.7801803168173377e-61428 .9999999999928109 3.791883661451391e-61429 .9999999999927663 3.803587006085444e-61430 .9999999999927218 3.8152903507194965e-61431 .9999999999926771 3.826993695353548e-61432 .9999999999926322 3.838697039987599e-61433 .9999999999925873 3.85040038462165e-61434 .9999999999925421 3.862103729255701e-61435 .9999999999924968 3.87380707388975e-61436 .9999999999924514 3.885510418523799e-61437 .9999999999924059 3.897213763157848e-61438 .9999999999923602 3.9089171077918965e-61439 .9999999999923144 3.9206204524259435e-61440 .9999999999922684 3.9323237970599905e-61441 .9999999999922223 3.9440271416940376e-61442 .9999999999921761 3.955730486328084e-61443 .9999999999921297 3.967433830962129e-61444 .9999999999920832 3.9791371755961736e-61445 .9999999999920366 3.990840520230218e-61446 .9999999999919899 4.002543864864262e-61447 .9999999999919429 4.014247209498305e-61448 .9999999999918958 4.025950554132348e-61449 .9999999999918486 4.03765389876639e-61450 .9999999999918013 4.049357243400431e-61451 .9999999999917539 4.061060588034472e-61452 .9999999999917063 4.072763932668513e-61453 .9999999999916586 4.084467277302553e-61454 .9999999999916107 4.096170621936592e-61455 .9999999999915626 4.107873966570632e-61456 .9999999999915146 4.119577311204669e-61457 .9999999999914663 4.131280655838707e-61458 .9999999999914179 4.142984000472745e-61459 .9999999999913692 4.154687345106781e-61460 .9999999999913206 4.166390689740817e-61461 .9999999999912718 4.178094034374852e-61462 .9999999999912228 4.189797379008887e-61463 .9999999999911737 4.201500723642921e-61464 .9999999999911244 4.213204068276955e-61465 .999999999991075 4.224907412910988e-61466 .9999999999910255 4.236610757545021e-61467 .9999999999909759 4.248314102179053e-61468 .9999999999909261 4.260017446813084e-61469 .9999999999908762 4.271720791447115e-61470 .9999999999908261 4.283424136081145e-61471 .9999999999907759 4.295127480715175e-61472 .9999999999907256 4.306830825349204e-61473 .9999999999906751 4.3185341699832325e-61474 .9999999999906245 4.33023751461726e-61475 .9999999999905738 4.3419408592512875e-61476 .9999999999905229 4.353644203885314e-61477 .9999999999904718 4.36534754851934e-61478 .9999999999904207 4.377050893153365e-61479 .9999999999903694 4.38875423778739e-61480 .999999999990318 4.400457582421414e-61481 .9999999999902665 4.4121609270554384e-61482 .9999999999902147 4.423864271689461e-61483 .9999999999901629 4.435567616323483e-61484 .9999999999901109 4.447270960957506e-61485 .9999999999900587 4.458974305591527e-61486 .9999999999900065 4.470677650225547e-61487 .9999999999899541 4.482380994859567e-61488 .9999999999899016 4.494084339493587e-61489 .9999999999898489 4.5057876841276054e-61490 .9999999999897962 4.517491028761624e-61491 .9999999999897432 4.529194373395641e-61492 .9999999999896901 4.5408977180296584e-61493 .999999999989637 4.552601062663675e-61494 .9999999999895836 4.564304407297691e-61495 .99999999998953 4.5760077519317055e-61496 .9999999999894764 4.5877110965657195e-61497 .9999999999894227 4.5994144411997335e-61498 .9999999999893688 4.611117785833747e-61499 .9999999999893148 4.622821130467759e-61500 .9999999999892606 4.634524475101771e-61501 .9999999999892063 4.646227819735783e-61502 .9999999999891518 4.657931164369793e-61503 .9999999999890973 4.669634509003803e-61504 .9999999999890425 4.681337853637813e-61505 .9999999999889877 4.693041198271821e-61506 .9999999999889327 4.704744542905829e-61507 .9999999999888776 4.716447887539837e-61508 .9999999999888223 4.728151232173843e-61509 .9999999999887669 4.73985457680785e-61510 .9999999999887114 4.751557921441855e-61511 .9999999999886556 4.76326126607586e-61512 .9999999999885999 4.774964610709864e-61513 .9999999999885439 4.786667955343868e-61514 .9999999999884878 4.798371299977871e-61515 .9999999999884316 4.810074644611873e-61516 .9999999999883752 4.821777989245874e-61517 .9999999999883187 4.833481333879875e-61518 .9999999999882621 4.845184678513876e-61519 .9999999999882053 4.856888023147875e-61520 .9999999999881484 4.868591367781874e-61521 .9999999999880914 4.880294712415872e-61522 .9999999999880341 4.89199805704987e-61523 .9999999999879768 4.903701401683867e-61524 .9999999999879194 4.915404746317863e-61525 .9999999999878618 4.9271080909518585e-61526 .9999999999878041 4.938811435585853e-61527 .9999999999877462 4.9505147802198475e-61528 .9999999999876882 4.962218124853841e-61529 .99999999998763 4.973921469487834e-61530 .9999999999875717 4.985624814121826e-61531 .9999999999875133 4.997328158755817e-61532 .9999999999874548 5.009031503389808e-61533 .9999999999873961 5.0207348480237985e-61534 .9999999999873372 5.032438192657788e-61535 .9999999999872783 5.0441415372917765e-61536 .9999999999872192 5.055844881925764e-61537 .9999999999871599 5.067548226559752e-61538 .9999999999871007 5.079251571193739e-61539 .9999999999870411 5.090954915827725e-61540 .9999999999869814 5.10265826046171e-61541 .9999999999869217 5.1143616050956945e-61542 .9999999999868617 5.126064949729678e-61543 .9999999999868017 5.1377682943636615e-61544 .9999999999867415 5.149471638997644e-61545 .9999999999866811 5.161174983631626e-61546 .9999999999866207 5.172878328265607e-61547 .9999999999865601 5.184581672899587e-61548 .9999999999864994 5.196285017533567e-61549 .9999999999864384 5.2079883621675455e-61550 .9999999999863775 5.219691706801524e-61551 .9999999999863163 5.2313950514355015e-61552 .999999999986255 5.243098396069478e-61553 .9999999999861935 5.254801740703454e-61554 .999999999986132 5.266505085337429e-61555 .9999999999860703 5.278208429971404e-61556 .9999999999860084 5.289911774605378e-61557 .9999999999859465 5.301615119239351e-61558 .9999999999858843 5.313318463873323e-61559 .9999999999858221 5.325021808507295e-61560 .9999999999857597 5.336725153141267e-61561 .9999999999856971 5.3484284977752366e-61562 .9999999999856345 5.360131842409206e-61563 .9999999999855717 5.371835187043175e-61564 .9999999999855087 5.383538531677143e-61565 .9999999999854456 5.3952418763111104e-61566 .9999999999853825 5.406945220945077e-61567 .9999999999853191 5.418648565579043e-61568 .9999999999852557 5.4303519102130076e-61569 .9999999999851921 5.4420552548469724e-61570 .9999999999851282 5.453758599480936e-61571 .9999999999850644 5.465461944114899e-61572 .9999999999850003 5.47716528874886e-61573 .9999999999849362 5.488868633382822e-61574 .9999999999848719 5.500571978016782e-61575 .9999999999848074 5.512275322650742e-61576 .9999999999847429 5.523978667284702e-61577 .9999999999846781 5.53568201191866e-61578 .9999999999846133 5.547385356552617e-61579 .9999999999845482 5.5590887011865745e-61580 .9999999999844832 5.57079204582053e-61581 .9999999999844179 5.582495390454486e-61582 .9999999999843525 5.59419873508844e-61583 .9999999999842869 5.605902079722394e-61584 .9999999999842213 5.617605424356347e-61585 .9999999999841555 5.629308768990299e-61586 .9999999999840895 5.641012113624251e-61587 .9999999999840234 5.652715458258201e-61588 .9999999999839572 5.664418802892152e-61589 .9999999999838908 5.6761221475261e-61590 .9999999999838243 5.687825492160048e-61591 .9999999999837577 5.699528836793996e-61592 .9999999999836909 5.711232181427943e-61593 .999999999983624 5.722935526061889e-61594 .9999999999835569 5.734638870695834e-61595 .9999999999834898 5.746342215329779e-61596 .9999999999834225 5.758045559963722e-61597 .999999999983355 5.769748904597665e-61598 .9999999999832874 5.781452249231607e-61599 .9999999999832196 5.793155593865548e-61600 .9999999999831518 5.804858938499489e-61601 .9999999999830838 5.816562283133429e-61602 .9999999999830157 5.8282656277673675e-61603 .9999999999829474 5.839968972401306e-61604 .9999999999828789 5.851672317035243e-61605 .9999999999828104 5.86337566166918e-61606 .9999999999827417 5.875079006303115e-61607 .9999999999826729 5.88678235093705e-61608 .9999999999826039 5.898485695570985e-61609 .9999999999825349 5.910189040204917e-61610 .9999999999824656 5.92189238483885e-61611 .9999999999823962 5.933595729472782e-61612 .9999999999823267 5.945299074106713e-61613 .9999999999822571 5.957002418740643e-61614 .9999999999821872 5.9687057633745715e-61615 .9999999999821173 5.9804091080085e-61616 )))16171618(define (make-w log-n)1619 (let ((n (expt 2 log-n))) ;; number of complexes1620 (if (fx<= n lut-table-size)1621 low-lut1622 (let ((result (make-f64vector (fx* 2 n))))16231624 (define (copy-low-lut)1625 (do ((i 0 (fx+ i 1)))1626 ((fx= i lut-table-size))1627 (let ((index (fx* i 2)))1628 (f64vector-set!1629 result1630 index1631 (f64vector-ref low-lut index))1632 (f64vector-set!1633 result1634 (fx+ index 1)1635 (f64vector-ref low-lut (fx+ index 1))))))16361637 (define (extend-lut multiplier-lut bit-reverse-size bit-reverse-multiplier start end)16381639 (define (bit-reverse x n)1640 (do ((i 0 (fx+ i 1))1641 (x x (fxarithmetic-shift-right x 1))1642 (result 0 (fx+ (fx* result 2)1643 (bitwise-and x 1))))1644 ((fx= i n) result)))16451646 (let loop ((i start)1647 (j 1))1648 (if (fx< i end)1649 (let* ((multiplier-index1650 (fx* 21651 (fx* (bit-reverse j bit-reverse-size)1652 bit-reverse-multiplier)))1653 (multiplier-real1654 (f64vector-ref multiplier-lut multiplier-index))1655 (multiplier-imag1656 (f64vector-ref multiplier-lut (fx+ multiplier-index 1))))1657 (let inner ((i i)1658 (k 0))1659 ;; we copy complex multiples of all entries below1660 ;; start to entries starting at start1661 (if (fx< k start)1662 (let* ((index1663 (fx* k 2))1664 (real1665 (f64vector-ref result index))1666 (imag1667 (f64vector-ref result (fx+ index 1)))1668 (result-real1669 (fl- (fl* multiplier-real real)1670 (fl* multiplier-imag imag)))1671 (result-imag1672 (fl+ (fl* multiplier-real imag)1673 (fl* multiplier-imag real)))1674 (result-index (fx* i 2)))1675 (f64vector-set! result result-index result-real)1676 (f64vector-set! result (fx+ result-index 1) result-imag)1677 (inner (fx+ i 1)1678 (fx+ k 1)))1679 (loop i1680 (fx+ j 1)))))1681 result)))16821683 (cond ((fx<= n lut-table-size^2)1684 (copy-low-lut)1685 (extend-lut med-lut1686 (fx- log-n log-lut-table-size)1687 (fxarithmetic-shift-left 1 (fx- (fx* 2 log-lut-table-size) log-n))1688 lut-table-size1689 n))1690 ((fx<= n lut-table-size^3)1691 (copy-low-lut)1692 (extend-lut med-lut1693 log-lut-table-size1694 11695 lut-table-size1696 lut-table-size^2)1697 (extend-lut high-lut1698 (fx- log-n (fx* 2 log-lut-table-size))1699 (fxarithmetic-shift-left 1 (fx- (fx* 3 log-lut-table-size) log-n))1700 lut-table-size^21701 n))1702 (else1703 (error "asking for too large a table")))))))17041705(define (direct-fft-recursive-4 a W-table)17061707 ;; This is a direcct complex fft, using a decimation-in-time1708 ;; algorithm with inputs in natural order and outputs in1709 ;; bit-reversed order. The table of "twiddle" factors is in1710 ;; bit-reversed order.17111712 ;; this is from page 66 of Chu and George, except that we have1713 ;; combined passes in pairs to cut the number of passes through1714 ;; the vector a17151716 (let ((W (f64vector 0. 0. 0. 0.)))17171718 (define (main-loop M N K SizeOfGroup)17191720 (let inner-loop ((K K)1721 (JFirst M))17221723 (if (fx< JFirst N)17241725 (let* ((JLast (fx+ JFirst SizeOfGroup)))17261727 (if (fxeven? K)1728 (begin1729 (f64vector-set! W 0 (f64vector-ref W-table K))1730 (f64vector-set! W 1 (f64vector-ref W-table (fx+ K 1))))1731 (begin1732 (f64vector-set! W 0 (fl- 0. (f64vector-ref W-table K)))1733 (f64vector-set! W 1 (f64vector-ref W-table (fx- K 1)))))17341735 ;; we know the that the next two complex roots of1736 ;; unity have index 2K and 2K+1 so that the 2K+11737 ;; index root can be gotten from the 2K index root1738 ;; in the same way that we get W_0 and W_1 from the1739 ;; table depending on whether K is even or not17401741 (f64vector-set! W 2 (f64vector-ref W-table (fx* K 2)))1742 (f64vector-set! W 3 (f64vector-ref W-table (fx+ (fx* K 2) 1)))17431744 (let J-loop ((J0 JFirst))1745 (if (fx< J0 JLast)17461747 (let* ((J0 J0)1748 (J1 (fx+ J0 1))1749 (J2 (fx+ J0 SizeOfGroup))1750 (J3 (fx+ J2 1))1751 (J4 (fx+ J2 SizeOfGroup))1752 (J5 (fx+ J4 1))1753 (J6 (fx+ J4 SizeOfGroup))1754 (J7 (fx+ J6 1)))17551756 (let ((W_0 (f64vector-ref W 0))1757 (W_1 (f64vector-ref W 1))1758 (W_2 (f64vector-ref W 2))1759 (W_3 (f64vector-ref W 3))1760 (a_J0 (f64vector-ref a J0))1761 (a_J1 (f64vector-ref a J1))1762 (a_J2 (f64vector-ref a J2))1763 (a_J3 (f64vector-ref a J3))1764 (a_J4 (f64vector-ref a J4))1765 (a_J5 (f64vector-ref a J5))1766 (a_J6 (f64vector-ref a J6))1767 (a_J7 (f64vector-ref a J7)))17681769 ;; first we do the (overlapping) pairs of1770 ;; butterflies with entries 2*SizeOfGroup1771 ;; apart.17721773 (let ((Temp_0 (fl- (fl* W_0 a_J4)1774 (fl* W_1 a_J5)))1775 (Temp_1 (fl+ (fl* W_0 a_J5)1776 (fl* W_1 a_J4)))1777 (Temp_2 (fl- (fl* W_0 a_J6)1778 (fl* W_1 a_J7)))1779 (Temp_3 (fl+ (fl* W_0 a_J7)1780 (fl* W_1 a_J6))))17811782 (let ((a_J0 (fl+ a_J0 Temp_0))1783 (a_J1 (fl+ a_J1 Temp_1))1784 (a_J2 (fl+ a_J2 Temp_2))1785 (a_J3 (fl+ a_J3 Temp_3))1786 (a_J4 (fl- a_J0 Temp_0))1787 (a_J5 (fl- a_J1 Temp_1))1788 (a_J6 (fl- a_J2 Temp_2))1789 (a_J7 (fl- a_J3 Temp_3)))17901791 ;; now we do the two (disjoint) pairs1792 ;; of butterflies distance SizeOfGroup1793 ;; apart, the first pair with W2+W3i,1794 ;; the second with -W3+W2i17951796 ;; we rewrite the multipliers so I1797 ;; don't hurt my head too much when1798 ;; thinking about them.17991800 (let ((W_0 W_2)1801 (W_1 W_3)1802 (W_2 (fl- 0. W_3))1803 (W_3 W_2))18041805 (let ((Temp_01806 (fl- (fl* W_0 a_J2)1807 (fl* W_1 a_J3)))1808 (Temp_11809 (fl+ (fl* W_0 a_J3)1810 (fl* W_1 a_J2)))1811 (Temp_21812 (fl- (fl* W_2 a_J6)1813 (fl* W_3 a_J7)))1814 (Temp_31815 (fl+ (fl* W_2 a_J7)1816 (fl* W_3 a_J6))))18171818 (let ((a_J0 (fl+ a_J0 Temp_0))1819 (a_J1 (fl+ a_J1 Temp_1))1820 (a_J2 (fl- a_J0 Temp_0))1821 (a_J3 (fl- a_J1 Temp_1))1822 (a_J4 (fl+ a_J4 Temp_2))1823 (a_J5 (fl+ a_J5 Temp_3))1824 (a_J6 (fl- a_J4 Temp_2))1825 (a_J7 (fl- a_J5 Temp_3)))18261827 (f64vector-set! a J0 a_J0)1828 (f64vector-set! a J1 a_J1)1829 (f64vector-set! a J2 a_J2)1830 (f64vector-set! a J3 a_J3)1831 (f64vector-set! a J4 a_J4)1832 (f64vector-set! a J5 a_J5)1833 (f64vector-set! a J6 a_J6)1834 (f64vector-set! a J7 a_J7)18351836 (J-loop (fx+ J0 2)))))))))1837 (inner-loop (fx+ K 1)1838 (fx+ JFirst (fx* SizeOfGroup 4)))))))))18391840 (define (recursive-bit M N K SizeOfGroup)1841 (if (fx<= 2 SizeOfGroup)1842 (begin1843 (main-loop M N K SizeOfGroup)1844 (if (fx< 2048 (fx- N M))1845 (let ((new-size (fxarithmetic-shift-right (fx- N M) 2)))1846 (recursive-bit M1847 (fx+ M new-size)1848 (fx* K 4)1849 (fxarithmetic-shift-right SizeOfGroup 2))1850 (recursive-bit (fx+ M new-size)1851 (fx+ M (fx* new-size 2))1852 (fx+ (fx* K 4) 1)1853 (fxarithmetic-shift-right SizeOfGroup 2))1854 (recursive-bit (fx+ M (fx* new-size 2))1855 (fx+ M (fx* new-size 3))1856 (fx+ (fx* K 4) 2)1857 (fxarithmetic-shift-right SizeOfGroup 2))1858 (recursive-bit (fx+ M (fx* new-size 3))1859 N1860 (fx+ (fx* K 4) 3)1861 (fxarithmetic-shift-right SizeOfGroup 2)))1862 (recursive-bit M1863 N1864 (fx* K 4)1865 (fxarithmetic-shift-right SizeOfGroup 2))))))18661867 (define (radix-2-pass a)18681869 ;; If we're here, the size of our (conceptually complex)1870 ;; array is not a power of 4, so we need to do a basic radix1871 ;; two pass with w=1 (so W[0]=1.0 and W[1] = 0.) and then1872 ;; call recursive-bit appropriately on the two half arrays.18731874 (let ((SizeOfGroup1875 (fxarithmetic-shift-right (f64vector-length a) 1)))1876 (let loop ((J0 0))1877 (if (fx< J0 SizeOfGroup)1878 (let ((J0 J0)1879 (J2 (fx+ J0 SizeOfGroup)))1880 (let ((J1 (fx+ J0 1))1881 (J3 (fx+ J2 1)))1882 (let ((a_J0 (f64vector-ref a J0))1883 (a_J1 (f64vector-ref a J1))1884 (a_J2 (f64vector-ref a J2))1885 (a_J3 (f64vector-ref a J3)))1886 (let ((a_J0 (fl+ a_J0 a_J2))1887 (a_J1 (fl+ a_J1 a_J3))1888 (a_J2 (fl- a_J0 a_J2))1889 (a_J3 (fl- a_J1 a_J3)))1890 (f64vector-set! a J0 a_J0)1891 (f64vector-set! a J1 a_J1)1892 (f64vector-set! a J2 a_J2)1893 (f64vector-set! a J3 a_J3)1894 (loop (fx+ J0 2))))))))))18951896 (let* ((n (f64vector-length a))1897 (log_n (two^p>=m n)))18981899 ;; there are n/2 complex entries in a; if n/2 is not a power1900 ;; of 4, then do a single radix-2 pass and do the rest of1901 ;; the passes as radix-4 passes19021903 (if (fxodd? log_n)1904 (recursive-bit 0 n 0 (fxarithmetic-shift-right n 2))1905 (let ((n/2 (fxarithmetic-shift-right n 1))1906 (n/8 (fxarithmetic-shift-right n 3)))1907 (radix-2-pass a)1908 (recursive-bit 0 n/2 0 n/8)1909 (recursive-bit n/2 n 1 n/8))))))19101911(define (inverse-fft-recursive-4 a W-table)19121913 ;; This is an complex fft, using a decimation-in-frequency algorithm1914 ;; with inputs in bit-reversed order and outputs in natural order.19151916 ;; The organization of the algorithm has little to do with the1917 ;; associated algorithm on page 41 of Chu and George,1918 ;; I just reversed the operations of the direct algorithm given1919 ;; above (without dividing by 2 each time, so that this has to1920 ;; be "normalized" by dividing by N/2 at the end.19211922 ;; The table of "twiddle" factors is in bit-reversed order.19231924 (let ((W (f64vector 0. 0. 0. 0.)))19251926 (define (main-loop M N K SizeOfGroup)1927 (let inner-loop ((K K)1928 (JFirst M))1929 (if (fx< JFirst N)1930 (let* ((JLast (fx+ JFirst SizeOfGroup)))1931 (if (fxeven? K)1932 (begin1933 (f64vector-set! W 0 (f64vector-ref W-table K))1934 (f64vector-set! W 1 (f64vector-ref W-table (fx+ K 1))))1935 (begin1936 (f64vector-set! W 0 (fl- 0. (f64vector-ref W-table K)))1937 (f64vector-set! W 1 (f64vector-ref W-table (fx- K 1)))))1938 (f64vector-set! W 2 (f64vector-ref W-table (fx* K 2)))1939 (f64vector-set! W 3 (f64vector-ref W-table (fx+ (fx* K 2) 1)))1940 (let J-loop ((J0 JFirst))1941 (if (fx< J0 JLast)1942 (let* ((J0 J0)1943 (J1 (fx+ J0 1))1944 (J2 (fx+ J0 SizeOfGroup))1945 (J3 (fx+ J2 1))1946 (J4 (fx+ J2 SizeOfGroup))1947 (J5 (fx+ J4 1))1948 (J6 (fx+ J4 SizeOfGroup))1949 (J7 (fx+ J6 1)))1950 (let ((W_0 (f64vector-ref W 0))1951 (W_1 (f64vector-ref W 1))1952 (W_2 (f64vector-ref W 2))1953 (W_3 (f64vector-ref W 3))1954 (a_J0 (f64vector-ref a J0))1955 (a_J1 (f64vector-ref a J1))1956 (a_J2 (f64vector-ref a J2))1957 (a_J3 (f64vector-ref a J3))1958 (a_J4 (f64vector-ref a J4))1959 (a_J5 (f64vector-ref a J5))1960 (a_J6 (f64vector-ref a J6))1961 (a_J7 (f64vector-ref a J7)))1962 (let ((W_00 W_2)1963 (W_01 W_3)1964 (W_02 (fl- 0. W_3))1965 (W_03 W_2))1966 (let ((Temp_0 (fl- a_J0 a_J2))1967 (Temp_1 (fl- a_J1 a_J3))1968 (Temp_2 (fl- a_J4 a_J6))1969 (Temp_3 (fl- a_J5 a_J7)))1970 (let ((a_J0 (fl+ a_J0 a_J2))1971 (a_J1 (fl+ a_J1 a_J3))1972 (a_J4 (fl+ a_J4 a_J6))1973 (a_J5 (fl+ a_J5 a_J7))1974 (a_J2 (fl+ (fl* W_00 Temp_0)1975 (fl* W_01 Temp_1)))1976 (a_J3 (fl- (fl* W_00 Temp_1)1977 (fl* W_01 Temp_0)))1978 (a_J6 (fl+ (fl* W_02 Temp_2)1979 (fl* W_03 Temp_3)))1980 (a_J7 (fl- (fl* W_02 Temp_3)1981 (fl* W_03 Temp_2))))1982 (let ((Temp_0 (fl- a_J0 a_J4))1983 (Temp_1 (fl- a_J1 a_J5))1984 (Temp_2 (fl- a_J2 a_J6))1985 (Temp_3 (fl- a_J3 a_J7)))1986 (let ((a_J0 (fl+ a_J0 a_J4))1987 (a_J1 (fl+ a_J1 a_J5))1988 (a_J2 (fl+ a_J2 a_J6))1989 (a_J3 (fl+ a_J3 a_J7))1990 (a_J4 (fl+ (fl* W_0 Temp_0)1991 (fl* W_1 Temp_1)))1992 (a_J5 (fl- (fl* W_0 Temp_1)1993 (fl* W_1 Temp_0)))1994 (a_J6 (fl+ (fl* W_0 Temp_2)1995 (fl* W_1 Temp_3)))1996 (a_J7 (fl- (fl* W_0 Temp_3)1997 (fl* W_1 Temp_2))))1998 (f64vector-set! a J0 a_J0)1999 (f64vector-set! a J1 a_J1)2000 (f64vector-set! a J2 a_J2)2001 (f64vector-set! a J3 a_J3)2002 (f64vector-set! a J4 a_J4)2003 (f64vector-set! a J5 a_J5)2004 (f64vector-set! a J6 a_J6)2005 (f64vector-set! a J7 a_J7)2006 (J-loop (fx+ J0 2)))))))))2007 (inner-loop (fx+ K 1)2008 (fx+ JFirst (fx* SizeOfGroup 4)))))))))20092010 (define (recursive-bit M N K SizeOfGroup)2011 (if (fx<= 2 SizeOfGroup)2012 (begin2013 (if (fx< 2048 (fx- N M))2014 (let ((new-size (fxarithmetic-shift-right (fx- N M) 2)))2015 (recursive-bit M2016 (fx+ M new-size)2017 (fx* K 4)2018 (fxarithmetic-shift-right SizeOfGroup 2))2019 (recursive-bit (fx+ M new-size)2020 (fx+ M (fx* new-size 2))2021 (fx+ (fx* K 4) 1)2022 (fxarithmetic-shift-right SizeOfGroup 2))2023 (recursive-bit (fx+ M (fx* new-size 2))2024 (fx+ M (fx* new-size 3))2025 (fx+ (fx* K 4) 2)2026 (fxarithmetic-shift-right SizeOfGroup 2))2027 (recursive-bit (fx+ M (fx* new-size 3))2028 N2029 (fx+ (fx* K 4) 3)2030 (fxarithmetic-shift-right SizeOfGroup 2)))2031 (recursive-bit M2032 N2033 (fx* K 4)2034 (fxarithmetic-shift-right SizeOfGroup 2)))2035 (main-loop M N K SizeOfGroup))))20362037 (define (radix-2-pass a)2038 (let ((SizeOfGroup2039 (fxarithmetic-shift-right (f64vector-length a) 1)))2040 (let loop ((J0 0))2041 (if (fx< J0 SizeOfGroup)2042 (let ((J0 J0)2043 (J2 (fx+ J0 SizeOfGroup)))2044 (let ((J1 (fx+ J0 1))2045 (J3 (fx+ J2 1)))2046 (let ((a_J0 (f64vector-ref a J0))2047 (a_J1 (f64vector-ref a J1))2048 (a_J2 (f64vector-ref a J2))2049 (a_J3 (f64vector-ref a J3)))2050 (let ((a_J0 (fl+ a_J0 a_J2))2051 (a_J1 (fl+ a_J1 a_J3))2052 (a_J2 (fl- a_J0 a_J2))2053 (a_J3 (fl- a_J1 a_J3)))2054 (f64vector-set! a J0 a_J0)2055 (f64vector-set! a J1 a_J1)2056 (f64vector-set! a J2 a_J2)2057 (f64vector-set! a J3 a_J3)2058 (loop (fx+ J0 2))))))))))20592060 (let* ((n (f64vector-length a))2061 (log_n (two^p>=m n)))2062 (if (fxodd? log_n)2063 (recursive-bit 0 n 0 (fxarithmetic-shift-right n 2))2064 (let ((n/2 (fxarithmetic-shift-right n 1))2065 (n/8 (fxarithmetic-shift-right n 3)))2066 (recursive-bit 0 n/2 0 n/8)2067 (recursive-bit n/2 n 1 n/8)2068 (radix-2-pass a))))))20692070(define (two^p>=m m)2071 ;; returns smallest p, assumes fixnum m >= 02072 (do ((p 0 (fx+ p 1))2073 (two^p 1 (fx* two^p 2)))2074 ((fx<= m two^p) p)))20752076(define (test iters n)2077 (let ((two^n2078 (expt 2 n))2079 (table2080 (make-w (fx- n 1))))2081 ;(display (fx* two^n 2))(newline)2082 (let ((a2083 (make-f64vector (fx* two^n 2) 0.)))2084 (do ((i 0 (fx+ i 1)))2085 ((fx= i iters)2086 ;(write table) (newline)2087 )2088 (direct-fft-recursive-4 a table)2089 (inverse-fft-recursive-4 a table)))))20902091(cond-expand2092 (chicken2093 (let-optionals (command-line-arguments)2094 ((iters "2000")2095 (n "11"))2096 (test (string->number iters) (string->number n))))2097 (else (test 2000 11)))