diff --git a/pkgs/math-pkgs/math-lib/math/private/flonum/expansion/expansion-exp-reduction.rkt b/pkgs/math-pkgs/math-lib/math/private/flonum/expansion/expansion-exp-reduction.rkt index 6ba36a5356..5650f6b51f 100644 --- a/pkgs/math-pkgs/math-lib/math/private/flonum/expansion/expansion-exp-reduction.rkt +++ b/pkgs/math-pkgs/math-lib/math/private/flonum/expansion/expansion-exp-reduction.rkt @@ -47,15 +47,19 @@ negative. (cond [(x . fl> . expm1-max) (values x 0.0 0.0)] [(x . fl>= . expm1-min) (define k (flfloor (fl/ (fllog x) (fllog base)))) - (define expm1-b^k (vector-ref positive-ds (- (fl->exact-integer k) kmin))) + (define i (- (fl->exact-integer k) kmin)) + (define expm1-b^k (vector-ref positive-ds i)) + (define b^k (vector-ref base^ks i)) (let*-values ([(d2 d1) (values (car expm1-b^k) (cdr expm1-b^k))]) - (values (fl- x (flexpt base k)) d2 d1))] + (values (fl- x b^k) d2 d1))] [(x . fl> . (- expm1-min)) (values x 0.0 0.0)] [(x . fl> . -650.0) (define k (flfloor (fl/ (fllog (- x)) (fllog base)))) - (define expm1-b^k (vector-ref negative-ds (- (fl->exact-integer k) kmin))) + (define i (- (fl->exact-integer k) kmin)) + (define expm1-b^k (vector-ref negative-ds i)) + (define b^k (vector-ref base^ks i)) (let*-values ([(d2 d1) (values (car expm1-b^k) (cdr expm1-b^k))]) - (values (fl+ x (flexpt base k)) d2 d1))] + (values (fl+ x b^k) d2 d1))] [(x . fl> . (fllog +min.0)) ;; This special case keeps flexpm1-reduction from returning subnormals (values (fl+ x 650.0) expm1-neg-650-hi expm1-neg-650-lo)] @@ -67,6 +71,11 @@ negative. (require "../../../bigfloat.rkt" "expansion-base.rkt") +(: base^ks (Vectorof Flonum)) +;; base^k for each kmin <= k <= kmax +(define base^ks + (build-vector (- (+ kmax 1) kmin) (λ: ([k : Index]) (flexpt base (fl (+ k kmin)))))) + (: positive-ds (Vectorof (Pair Flonum Flonum))) ;; exp(base^k) - 1 for each kmin <= k <= kmax (define positive-ds @@ -88,6 +97,472 @@ negative. (cons y2 y1))))) |# +(: base^ks (Vectorof Flonum)) +(define base^ks + #(0.0004849953040935936 + 0.0005001514073465185 + 0.0005157811388260972 + 0.0005318992994144127 + 0.0005485211525211131 + 0.0005656624385373979 + 0.0005833393897416915 + 0.0006015687456711194 + 0.0006203677689733418 + 0.0006397542617537588 + 0.0006597465824335637 + 0.0006803636631346127 + 0.0007016250276075693 + 0.0007235508097203059 + 0.0007461617725240654 + 0.0007694793279154424 + 0.0007935255569128001 + 0.000818323230566325 + 0.0008438958315215226 + 0.0008702675762565702 + 0.0008974634380145881 + 0.0009255091704525439 + 0.000954431332029186 + 0.000984257311155098 + 0.0010150153521286949 + 0.0010467345818827166 + 0.0010794450375665515 + 0.0011131776949905063 + 0.0011479644979589595 + 0.001183838388520177 + 0.0012208333381614324 + 0.0012589843799789772 + 0.0012983276418533202 + 0.0013389003806612365 + 0.0013807410175569002 + 0.0014238891743555532 + 0.0014683857110541643 + 0.001514272764524607 + 0.001561593788416001 + 0.001610393594304001 + 0.001660718394126001 + 0.0017126158439424385 + 0.0017661350890656397 + 0.0018213268105989411 + 0.001878243273430158 + 0.0019369383757248503 + 0.001997467699966252 + 0.0020598885655901972 + 0.002124260083264891 + 0.002190643210866919 + 0.00225910081120651 + 0.0023296977115567137 + 0.0024025007650428608 + 0.0024775789139504503 + 0.002555003255011402 + 0.002634847106730508 + 0.0027171860788158366 + 0.002802098143778831 + 0.00288966371077192 + 0.002979965701733542 + 0.0030730896299127155 + 0.003169123680847488 + 0.003268158795873972 + 0.0033702887582450335 + 0.003475610281940191 + 0.0035842231032508216 + 0.00369623007522741 + 0.0038117372650782666 + 0.003930854054611963 + 0.004053693243818586 + 0.004180371157687917 + 0.004311007756365664 + 0.004445726748752091 + 0.004584655709650594 + 0.004727926200577175 + 0.004875673894345212 + 0.0050280387035435 + 0.005185164913029235 + 0.005347201316561398 + 0.005514301357703941 + 0.00568662327513219 + 0.005864330252480071 + 0.006047590572870073 + 0.006236577778272263 + 0.00643147083384327 + 0.006632454297400873 + 0.00683971849419465 + 0.007053459697138233 + 0.007273880312673803 + 0.007501189072444859 + 0.007735601230958761 + 0.007977338769426223 + 0.008226630605970791 + 0.008483712812407378 + 0.00874882883779511 + 0.009022229738976206 + 0.009304174418319213 + 0.009594929868891688 + 0.009894771427294554 + 0.010203983034397509 + 0.010522857504222431 + 0.010851696801229382 + 0.0111908123262678 + 0.011540525211463669 + 0.011901166624321908 + 0.012273078081331969 + 0.012656611771373592 + 0.013052130889229017 + 0.013460009979517424 + 0.013880635291377343 + 0.014314405144232885 + 0.014761730304990162 + 0.015223034377021105 + 0.015698754201303015 + 0.016189340270093736 + 0.016695257153534163 + 0.017216983939582105 + 0.017755014687694047 + 0.018309858896684485 + 0.018882041987205875 + 0.01947210579930606 + 0.020080609105534372 + 0.020708128140082323 + 0.021355257144459894 + 0.022022608930224268 + 0.022710815459293775 + 0.023420528442396706 + 0.024152419956221603 + 0.02490718307985353 + 0.02568553255109895 + 0.026488205443320794 + 0.027315961863424568 + 0.028169585671656585 + 0.029049885223895854 + 0.0299576941371426 + 0.030893872078928304 + 0.03185930558139482 + 0.032854908880813403 + 0.03388162478333882 + 0.03494042555781816 + 0.03603231385649998 + 0.0371583236645156 + 0.03831952127903172 + 0.03951700631900146 + 0.04075191276647025 + 0.04202541004042245 + 0.043338704104185645 + 0.04469303860744145 + 0.046089696063924 + 0.04752999906592162 + 0.04901531153673167 + 0.05054704002225453 + 0.05212663502294999 + 0.05375559236741718 + 0.05543545462889896 + 0.05716781258605205 + 0.058954306729366183 + 0.060796628814658873 + 0.06269652346511696 + 0.06465578982340187 + 0.06667628325538318 + 0.0687599171071139 + 0.07090866451671121 + 0.07312456028285844 + 0.07540970279169776 + 0.07776625600393831 + 0.08019645150406139 + 0.0827025906135633 + 0.08528704657023717 + 0.08795226677555708 + 0.09070077511229323 + 0.0935351743345524 + 0.09645814853250716 + 0.09947246567414801 + 0.10258098022646514 + 0.10578663585854217 + 0.10909246822912161 + 0.11250160786128166 + 0.11601728310694671 + 0.1196428232040388 + 0.12338166142916501 + 0.12723733834882642 + 0.13121350517222724 + 0.13531392720885935 + 0.1395424874341362 + 0.14390319016645295 + 0.1484001648591546 + 0.15303767001100319 + 0.15782009719884704 + 0.16275197523631102 + 0.16783797446244572 + 0.17308291116439717 + 0.17849175213828458 + 0.18406961939260597 + 0.1898217949986249 + 0.19575372609233194 + 0.2018710300327173 + 0.20817949972123972 + 0.21468510908752847 + 0.22139401874651374 + 0.22831258183234227 + 0.23544735001460299 + 0.24280507970255932 + 0.2503927384432643 + 0.2582175115196163 + 0.2662868087546043 + 0.2746082715281857 + 0.2831897800134415 + 0.29203946063886155 + 0.30116569378382596 + 0.3105771217145705 + 0.3202826567681509 + 0.33029148979215556 + 0.34061309884816043 + 0.35125725818716547 + 0.36223404750551436 + 0.3735538614900617 + 0.3852274196616261 + 0.39726577652605194 + 0.40968033204249105 + 0.4224828424188189 + 0.435685431244407 + 0.4493006009707947 + 0.46334124475113203 + 0.47782065864960493 + 0.4927525542324051 + 0.5081510715521678 + 0.524030792538173 + 0.5404067548049909 + 0.5572944658926469 + 0.574709917951792 + 0.5926696028877856 + 0.6111905279780289 + 0.6302902319773422 + 0.6499868017266343 + 0.6702988892805916 + 0.69124572957061 + 0.7128471586196916 + 0.735123632326557 + 0.7580962458367618 + 0.7817867535191607 + 0.8062175895666345 + 0.8314118892405917 + 0.8573935107793602 + 0.8841870579912152 + 0.9118179035534407 + 0.9403122130394858 + 0.9696969696969697 + 1.0 + 1.03125 + 1.0634765625 + 1.096710205078125 + 1.1309823989868164 + 1.1663255989551544 + 1.202773273922503 + 1.2403599387325812 + 1.2791211868179744 + 1.319093723906036 + 1.3603154027780997 + 1.4028252591149153 + 1.4466635484622565 + 1.491871784351702 + 1.5384927776126927 + 1.5865706769130892 + 1.6361510105666233 + 1.6872807296468302 + 1.7400082524482938 + 1.794383510337303 + 1.8504579950353437 + 1.9082848073801981 + 1.9679187076108293 + 2.0294161672236677 + 2.0928354224494075 + 2.158236529400951 + 2.225681420944731 + 2.295233965349254 + 2.366960026766418 + 2.440927527602869 + 2.5172065128404584 + 2.5958692163667227 + 2.676990129378183 + 2.760646070921251 + 2.8469162606375398 + 2.935882393782463 + 3.027628718588165 + 3.1222421160440454 + 3.2198121821704215 + 3.3204313128632474 + 3.424194791390224 + 3.5312008786211684 + 3.6415509060780797 + 3.7553493718930198 + 3.8727040397646766 + 3.993726041007323 + 4.118529979788802 + 4.247234041657202 + 4.37996010545899 + 4.516833858754583 + 4.657984916840664 + 4.803546945491934 + 4.953657787538557 + 5.108459593399137 + 5.26809895569286 + 5.432727048058262 + 5.602499768310082 + 5.777577886069773 + 5.958127195009453 + 6.144318669853498 + 6.33632862828642 + 6.534338897920371 + 6.738536988480383 + 6.9491162693703945 + 7.166276152788219 + 7.390222282562851 + 7.62116672889294 + 7.859328189170845 + 8.104932195082434 + 8.35821132617876 + 8.619405430121846 + 8.888761849813154 + 9.166535657619814 + 9.452989896920434 + 9.748395831199197 + 10.053033200924173 + 10.367190488453053 + 10.69116519121721 + 11.025264103442748 + 11.369803606675335 + 11.725109969383938 + 12.091519655927186 + 12.46937964517491 + 12.859047759086627 + 13.260893001558085 + 13.675295907856775 + 14.102648904977299 + 14.543356683257839 + 14.997836579609647 + 15.466518972722447 + 15.949847690620023 + 16.4482804309519 + 16.962289194419146 + 17.492360731744746 + 18.03899700461177 + 18.602715661005888 + 19.18405052541232 + 19.783552104331456 + 20.401788107591813 + 21.03934398595406 + 21.69682348551512 + 22.37484921943747 + 23.07406325754489 + 23.79512773434317 + 24.538725476041392 + 25.305560647167685 + 26.096359417391675 + 26.911870649185165 + 27.7528666069722 + 28.620143688440084 + 29.514523178703836 + 30.43685202803833 + 31.388003653914527 + 32.36887876809936 + 33.380406229602464 + 34.42354392427754 + 35.49927967191121 + 36.60863216165844 + 37.75265191671026 + 38.93242228910746 + 40.14906048564207 + 41.403718625818385 + 42.69758483287521 + 44.03188435890256 + 45.40788074511826 + 46.82687701840321 + 48.29021692522831 + 49.799286204141694 + 51.35551389802112 + 52.960373707334284 + 54.61538538568848 + 56.322116178991244 + 58.08218230958472 + 59.89725050675924 + 61.76903958509547 + 63.6993220721297 + 65.68992588688376 + 67.74273607084888 + 69.8596965730629 + 72.04281209097111 + 74.29414996881395 + 76.6158421553394 + 79.01008722269376 + 81.47915244840293 + 84.02537596241552 + 86.65116896124101 + 89.35901799127979 + 92.15148730350728 + 95.03122128174189 + 98.00094694679632 + 101.0634765388837 + 104.22171018072382 + 107.47863862387145 + 110.83734608086742 + 114.30101314589453 + 117.87291980670373 + 121.55644855066323 + 125.35508756787145 + 129.27243405436744 + 133.31219761856642 + 137.47820379414662 + 141.7743976627137 + 146.2048475896735 + 150.7737490768508 + 155.48542873550238 + 160.34434838348685 + 165.3551092704708 + 170.522456435173 + 175.85128319877217 + 181.34663579873381 + 187.01371816744424 + 192.85789686017688 + 198.8847061370574 + 205.09985320384044 + 211.50922361646045 + 218.11888685447485 + 224.93510206867717 + 231.96432400832333 + 239.21320913358343 + 246.68862191900791 + 254.39764135397692 + 262.3475676462887 + 270.5459291352352 + 279.00048942071135 + 287.71925471510855 + 296.7104814249557 + 305.98268396948555 + 315.54464284353196 + 325.4054129323924 + 335.57433208652964 + 346.0610299642337 + 356.875437150616 + 368.0277945615727 + 379.52866314162185 + 391.38893386479754 + 403.6198380480725 + 416.23295798707477 + 429.24023792417086 + 442.6539953593012 + 456.4869327142793 + 470.7521493616006 + 485.4631540291506 + 500.63387759256153 + 516.2786862673291 + 532.4123952131831 + 549.050282563595 + 566.2081038937074 + 583.9021071403857 + 602.1490479885229 + 620.9662057381641 + 640.3713996674818 + 660.3830059070906 + 681.0199748416873 + 702.3018490554899 + 724.248781838474)) + (: positive-ds (Vectorof (Pair Flonum Flonum))) (define positive-ds #((0.00048511293333186416 . 7.287053259455084e-21)