Made fl2exp' and fl2log' not depend on correctly rounded `flexpt'

This commit is contained in:
Neil Toronto 2013-10-15 11:30:35 -06:00
parent 0182e3ff33
commit efaa5bd181

View File

@ -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)