-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexp-itanium.c
723 lines (621 loc) · 59.6 KB
/
exp-itanium.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
/* file: exp_itanium.c
Author Florent de Dinechin, ENS-Lyon
Heavily inspired by code from Alexey V.Ershov, intel
and Christoph Lauter, Technische Universitaet Muenchen
WARNING : This code is dirty and experimental, and remains here for
history. A cleaner, portable version of an exponential using
double-extended arithmetic will be available as exp-de.c
To test within crlibm: (tested with Intel icc compiler version 8.1)
icc -mcpu=itanium -Qoption,cpp,--extended_float_types \
-IPF_fp_speculationsafe -c exp-itanium.c;\
mv exp-itanium.o exp_fast.o; make
icc -mcpu=itanium2 -Qoption,cpp,--extended_float_types \
-IPF_fp_speculationsafe -c exp-itanium.c;
mv exp-itanium.o exp_fast.o; make
This file is completely self-contained so that we can change the crlibm infrastructure without bothering maintaining it.
*/
typedef __int64 INT64;
typedef signed __int64 SINT64;
typedef unsigned __int64 UINT64;
/* FP register type */
typedef __fpreg L_FLOAT_TYPE;
/* Almost the same as the previous, except exponent field smaller, and morally in memory */
typedef long double LC_FLOAT_TYPE;
/* The double-double-ext type, using registers */
typedef struct __X_FLOAT_TYPE_TAG {
L_FLOAT_TYPE hi,lo; /* order is critical! */
} X_FLOAT_TYPE;
/* The double-double-ext type, in memory */
typedef struct __XC_FLOAT_TYPE_TAG {
LC_FLOAT_TYPE hi,lo; /* order is critical! */
} XC_FLOAT_TYPE;
/* Table 1-17: legal floating-point precision completers (.pc) */
typedef enum {
_PC_S = 1 /* single .s */
,_PC_D = 2 /* double .d */
,_PC_NONE = 3 /* dynamic */
} _Asm_pc;
/* Table 1-22: legal getf/setf floating-point register access completers */
typedef enum {
_FR_S = 1 /* single form .s */
,_FR_D = 2 /* double form .d */
,_FR_EXP = 3 /* exponent form .exp */
,_FR_SIG = 4 /* significand form .sig */
} _Asm_fr_access;
/* Table 1-24: legal floating-point FPSR status field completers (.sf) */
typedef enum {
_SF0 = 0 /* FPSR status field 0 .s0 */
,_SF1 = 1 /* FPSR status field 1 .s1 */
,_SF2 = 2 /* FPSR status field 2 .s2 */
,_SF3 = 3 /* FPSR status field 3 .s3 */
} _Asm_sf;
#define ULL(bits) 0x##bits##uLL
#if (!defined(EM64T) && defined(__linux__) && defined(IA32))
# define LDOUBLE_ALIGN 12 /* IA32 Linux: 12-byte alignment */
#else
# define LDOUBLE_ALIGN 16 /* EM64T, IA32 Win or IPF Win/Linux: 16-byte alignm\
ent */
#endif
#if (LDOUBLE_ALIGN == 16)
#define _XPD_ ,0x0000,0x0000,0x0000
#else /*12*/
#define _XPD_ ,0x0000
#endif
#define LDOUBLE_HEX(w4,w3,w2,w1,w0) 0x##w0,0x##w1,0x##w2,0x##w3,0x##w4 _XPD_ /*LITTLE_ENDIAN*/
/* Load XC constant data and convert to X format */
#define __X_CONVERT_XC2X( __x__, __xc__ ) \
(((__x__).hi = (__xc__).hi), ((__x__).lo = (__xc__).lo))
/* res = a*a
* res and a in X format
*/
#define __X_SQR_X( __resx__, __x_a__ ) \
{ \
L_FLOAT_TYPE __xsqrx_r_hi__,__xsqrx_r_lo__,__xsqrx_t__,__xsqrx_two__; \
__xsqrx_r_hi__ = (__x_a__).hi * (__x_a__).hi; \
__xsqrx_t__ = (__x_a__).hi * (__x_a__).lo; \
__xsqrx_r_lo__ = _Asm_fms( _PC_NONE, (__x_a__).hi, (__x_a__).hi, __xsqrx_r_hi__, _SF1 ); \
__xsqrx_two__ = _Asm_setf( _FR_EXP, 0xffff + 1 ); \
__xsqrx_r_lo__ = __xsqrx_two__ * __xsqrx_t__ + __xsqrx_r_lo__; \
(__resx__).hi = __xsqrx_r_hi__; (__resx__).lo = __xsqrx_r_lo__; \
}
/* res = a*a
* res in X format
* a in L format
*/
#define __X_SQR_L( __resx__, __l_a__ ) \
{ \
L_FLOAT_TYPE __xsqrl_r_hi__,__xsqrl_r_lo__; \
__xsqrl_r_hi__ = (__l_a__) * (__l_a__); \
__xsqrl_r_lo__ = _Asm_fms( _PC_NONE, (__l_a__), (__l_a__), __xsqrl_r_hi__, _SF1 ); \
(__resx__).hi = __xsqrl_r_hi__; (__resx__).lo = __xsqrl_r_lo__; \
}
/* res = a*b
* res, a and b in X format
*/
#define __X_MUL_XX( __resx__, __x_a__, __x_b__ ) \
{ \
L_FLOAT_TYPE __xmulxx_r_hi__,__xmulxx_r_lo__; \
L_FLOAT_TYPE __xmulxx_t1__,__xmulxx_t2__,__xmulxx_t3__; \
__xmulxx_r_hi__ = (__x_a__).hi * (__x_b__).hi; \
__xmulxx_t1__ = (__x_a__).hi * (__x_b__).lo; \
__xmulxx_t2__ = _Asm_fms( _PC_NONE, (__x_a__).hi, (__x_b__).hi, __xmulxx_r_hi__, _SF1 ); \
__xmulxx_t3__ = (__x_a__).lo * (__x_b__).hi + __xmulxx_t1__; \
__xmulxx_r_lo__ = (__xmulxx_t2__ + __xmulxx_t3__); \
(__resx__).hi = __xmulxx_r_hi__; (__resx__).lo = __xmulxx_r_lo__; \
}
/* res = a*b + c, assume |a*b| <= |c|
* res, a, b and c in X format
*/
#define __X_FMA_GREATER_XXX( __resx__, __x_a__, __x_b__, __x_c__ ) \
{ \
L_FLOAT_TYPE __xfmagxxx_r_hi__,__xfmagxxx_r_lo__; \
L_FLOAT_TYPE __xfmagxxx_t1__,__xfmagxxx_t2__; \
L_FLOAT_TYPE __xfmagxxx_t3__,__xfmagxxx_t4__; \
__xfmagxxx_r_hi__ = (__x_a__).hi * (__x_b__).hi + (__x_c__).hi; \
__xfmagxxx_t1__ = (__x_a__).lo * (__x_b__).hi + (__x_c__).lo; \
__xfmagxxx_t2__ = (__xfmagxxx_r_hi__ - (__x_c__).hi); \
__xfmagxxx_t3__ = (__x_a__).hi * (__x_b__).lo + __xfmagxxx_t1__; \
__xfmagxxx_t4__ = _Asm_fms( _PC_NONE, (__x_a__).hi, (__x_b__).hi, __xfmagxxx_t2__, _SF1 ); \
__xfmagxxx_r_lo__ = (__xfmagxxx_t3__ + __xfmagxxx_t4__); \
(__resx__).hi = __xfmagxxx_r_hi__; (__resx__).lo = __xfmagxxx_r_lo__; \
}
/* res = a*b + c, assume |a*b| <= |c|
* res, b and c in X format
* a in L format
*/
#define __X_FMA_GREATER_LXX( __resx__, __l_a__, __x_b__, __x_c__ ) \
{ \
L_FLOAT_TYPE __xfmaglxx_r_hi__,__xfmaglxx_r_lo__; \
L_FLOAT_TYPE __xfmaglxx_t2__; \
L_FLOAT_TYPE __xfmaglxx_t3__,__xfmaglxx_t4__; \
__xfmaglxx_r_hi__ = (__l_a__) * (__x_b__).hi + (__x_c__).hi; \
__xfmaglxx_t2__ = (__xfmaglxx_r_hi__ - (__x_c__).hi); \
__xfmaglxx_t3__ = (__l_a__) * (__x_b__).lo + (__x_c__).lo; \
__xfmaglxx_t4__ = _Asm_fms( _PC_NONE, (__l_a__), (__x_b__).hi, __xfmaglxx_t2__, _SF1 ); \
__xfmaglxx_r_lo__ = (__xfmaglxx_t3__ + __xfmaglxx_t4__); \
(__resx__).hi = __xfmaglxx_r_hi__; (__resx__).lo = __xfmaglxx_r_lo__; \
}
/* res = a*b + c, assume |a*b| <= |c|
* res, a and b in X format
* c in L format
*/
#define __X_FMA_GREATER_XXL( __resx__, __x_a__, __x_b__, __l_c__ ) \
{ \
L_FLOAT_TYPE __xfmagxxl_r_hi__,__xfmagxxl_r_lo__; \
L_FLOAT_TYPE __xfmagxxl_t1__,__xfmagxxl_t2__; \
L_FLOAT_TYPE __xfmagxxl_t3__,__xfmagxxl_t4__; \
__xfmagxxl_r_hi__ = (__x_a__).hi * (__x_b__).hi + (__l_c__); \
__xfmagxxl_t1__ = (__x_a__).lo * (__x_b__).hi; \
__xfmagxxl_t2__ = (__xfmagxxl_r_hi__ - (__l_c__)); \
__xfmagxxl_t3__ = (__x_a__).hi * (__x_b__).lo + __xfmagxxl_t1__; \
__xfmagxxl_t4__ = _Asm_fms( _PC_NONE, (__x_a__).hi, (__x_b__).hi, __xfmagxxl_t2__, _SF1 ); \
__xfmagxxl_r_lo__ = (__xfmagxxl_t3__ + __xfmagxxl_t4__); \
(__resx__).hi = __xfmagxxl_r_hi__; (__resx__).lo = __xfmagxxl_r_lo__; \
}
/* T1[i1] = 2^(i1/(K^1)) i1 = [-L/2..L/2]
* T2[i2] = 2^(i2/(K^2)) i2 = [-L/2..L/2]
*/
#define TX ((const XC_FLOAT_TYPE *)_TXL)
__declspec(align(16)) static const unsigned short _TXL[] = {
/* -64*/ LDOUBLE_HEX(3ffe,b504,f333,f9de,6484),LDOUBLE_HEX(3fbd,b2fb,1366,ea95,7d3e) /* ~0.70710678118654752438189403651591646848828531801700 T1[ 0] hi,lo */
/* -64*/ ,LDOUBLE_HEX(3ffe,ff4e,cb59,511e,c8a5),LDOUBLE_HEX(3fbc,c06e,885f,bc63,75f1) /* ~0.99729605608547012624747266085201147234329255297780 T2[ 0] hi,lo */
/* -63*/ ,LDOUBLE_HEX(3ffe,b600,93a8,5ed5,f76c),LDOUBLE_HEX(bfbd,9566,7ff0,b0cc,0214) /* ~0.71094630108458277992049267890450892082299105823040 T1[ 1] hi,lo */
/* -63*/ ,LDOUBLE_HEX(3ffe,ff51,8f3a,34cb,1c70),LDOUBLE_HEX(3fbd,d414,fb77,db11,52bc) /* ~0.99733824893045803280239303134635520109441131353378 T2[ 1] hi,lo */
/* -62*/ ,LDOUBLE_HEX(3ffe,b6fd,91e3,28d1,7791),LDOUBLE_HEX(3fb9,e2cb,e1bb,aa83,4b3f) /* ~0.71480666919598500561603207636984791406575823202729 T1[ 2] hi,lo */
/* -62*/ ,LDOUBLE_HEX(3ffe,ff54,5322,c329,f86f),LDOUBLE_HEX(3fba,e9b1,4513,ba49,7f30) /* ~0.99738044356050881746869260502386111966188764199614 T2[ 2] hi,lo */
/* -61*/ ,LDOUBLE_HEX(3ffe,b7fb,efca,8ca4,1e7c),LDOUBLE_HEX(3fbc,fc36,9e7c,4277,ff37) /* ~0.71868799872449116278826097836684994035749696195125 T1[ 3] hi,lo */
/* -61*/ ,LDOUBLE_HEX(3ffe,ff57,1712,fc50,9e7f),LDOUBLE_HEX(3fbd,8700,fef5,d3b7,14da) /* ~0.99742263997569800127026770630855878607690101489424 T2[ 3] hi,lo */
/* -60*/ ,LDOUBLE_HEX(3ffe,b8fb,af47,62fb,9ee9),LDOUBLE_HEX(3fbb,dc3c,bbc2,b35b,2d0d) /* ~0.72259040348852331001267348953298608194018015637993 T1[ 4] hi,lo */
/* -60*/ ,LDOUBLE_HEX(3ffe,ff59,db0a,e054,50ba),LDOUBLE_HEX(3fbb,f679,bcc2,0658,8201) /* ~0.99746483817610110853783128570526628209336195141077 T2[ 4] hi,lo */
/* -59*/ ,LDOUBLE_HEX(3ffe,b9fc,d245,2c0b,9deb),LDOUBLE_HEX(bfbb,d96c,65d5,3b9f,5478) /* ~0.72651399792452628242879139608412231154943583533167 T1[ 5] hi,lo */
/* -59*/ ,LDOUBLE_HEX(3ffe,ff5c,9f0a,6f4a,5174),LDOUBLE_HEX(bfbd,b0bf,02f2,53a4,00e8) /* ~0.99750703816179366674628259392676454808679409325122 T2[ 5] hi,lo */
/* -58*/ ,LDOUBLE_HEX(3ffe,baff,5ab2,133e,45fb),LDOUBLE_HEX(3fbd,e9aa,33a4,8b27,0718) /* ~0.73045889709032349430091121678110255288629559800028 T1[ 6] hi,lo */
/* -58*/ ,LDOUBLE_HEX(3ffe,ff5f,6311,a947,e33b),LDOUBLE_HEX(bfbc,a528,cf59,14b2,d1a3) /* ~0.99754923993285120651470718189379738305433420464396 T2[ 6] hi,lo */
/* -57*/ ,LDOUBLE_HEX(3ffe,bc03,4a7e,f2e9,fb0d),LDOUBLE_HEX(bfbc,a3fa,fef4,e9a8,9a84) /* ~0.73442521666849096343950356602370277414593147113919 T1[ 7] hi,lo */
/* -57*/ ,LDOUBLE_HEX(3ffe,ff62,2720,8e62,48da),LDOUBLE_HEX(bfbd,d1c7,8694,72f5,3da0) /* ~0.99759144348934926176900722660789710971585009247064 T2[ 7] hi,lo */
/* -56*/ ,LDOUBLE_HEX(3ffe,bd08,a39f,580c,36bf),LDOUBLE_HEX(bfbd,aefd,c093,25e0,a10c) /* ~0.73841307296974965571198165625865783567860489711165 T1[ 8] hi,lo */
/* -56*/ ,LDOUBLE_HEX(3ffe,ff64,eb37,1eae,c555),LDOUBLE_HEX(bfbc,e4bf,fcf3,e4d6,86d6) /* ~0.99763364883136336952506109665428368771245004609227 T2[ 8] hi,lo */
/* -55*/ ,LDOUBLE_HEX(3ffe,be0f,6809,8609,93e2),LDOUBLE_HEX(3fbd,9334,4593,7562,b2dd) /* ~0.74242258293637625025680054635657256767444778233766 T1[ 9] hi,lo */
/* -55*/ ,LDOUBLE_HEX(3ffe,ff67,af55,5a42,9bec),LDOUBLE_HEX(3fbc,dd7f,3c8d,5596,1f78) /* ~0.99767585595896907005135367807469037870760075747966 T2[ 9] hi,lo */
/* -54*/ ,LDOUBLE_HEX(3ffe,bf17,99b6,7a73,1083),LDOUBLE_HEX(bfbb,bf51,7aa1,a07a,3d7b) /* ~0.74645386414563242460538591838137278955400688573718 T1[ 10] hi,lo */
/* -54*/ ,LDOUBLE_HEX(3ffe,ff6a,737b,4133,101b),LDOUBLE_HEX(bfbd,a2df,4f03,c8fb,22c7) /* ~0.99771806487224190686897637436736374638712732121348 T2[ 10] hi,lo */
/* -53*/ ,LDOUBLE_HEX(3ffe,c021,3aa1,f0d0,8db0),LDOUBLE_HEX(3fbd,de67,649a,354e,a707) /* ~0.75050703481321276010901355491000686015468090772628 T1[ 11] hi,lo */
/* -53*/ ,LDOUBLE_HEX(3ffe,ff6d,37a8,d395,6596),LDOUBLE_HEX(bfbb,c802,1a75,cc6d,fa67) /* ~0.99776027557125742653478667198996276965772267431020 T2[ 11] hi,lo */
/* -52*/ ,LDOUBLE_HEX(3ffe,c12c,4cca,6670,9456),LDOUBLE_HEX(3fbd,f88a,fab3,4a01,0f6b) /* ~0.75458221379671136985669427366119066391547676175832 T1[ 12] hi,lo */
/* -52*/ ,LDOUBLE_HEX(3ffe,ff6f,fbde,117e,e04f),LDOUBLE_HEX(bfbd,de6d,fc11,1a38,5732) /* ~0.99780248805609117896666879210521017284918343648314 T2[ 12] hi,lo */
/* -51*/ ,LDOUBLE_HEX(3ffe,c238,d231,1e3d,6673),LDOUBLE_HEX(bfbd,d094,6839,bf6a,c8f1) /* ~0.75867952059910734942697538296663140044984174892306 T1[ 13] hi,lo */
/* -51*/ ,LDOUBLE_HEX(3ffe,ff72,c01a,fb04,c470),LDOUBLE_HEX(3fbd,a44f,1ba6,a6fe,09f6) /* ~0.99784470232681871711827303883524109551217406988143 T2[ 13] hi,lo */
/* -50*/ ,LDOUBLE_HEX(3ffe,c346,ccda,2497,6407),LDOUBLE_HEX(3fbc,83b2,1584,a2e0,e90a) /* ~0.76279907537226915341865493558337618651421507820487 T1[ 14] hi,lo */
/* -50*/ ,LDOUBLE_HEX(3ffe,ff75,845f,903c,5662),LDOUBLE_HEX(bfbc,df95,80fe,a0cf,dc67) /* ~0.99788691838351559735848655963152964432083535939455 T2[ 14] hi,lo */
/* -49*/ ,LDOUBLE_HEX(3ffe,c456,3ecc,5334,cb33),LDOUBLE_HEX(bfbd,cf43,20d2,b162,9ed8) /* ~0.76694099892047800092224549284303236618143273517489 T1[ 15] hi,lo */
/* -49*/ ,LDOUBLE_HEX(3ffe,ff78,48ab,d13a,dac5),LDOUBLE_HEX(bfbd,f1ee,64ae,cf61,1403) /* ~0.99792913622625737903775247628068711946980329230427 T2[ 15] hi,lo */
/* -48*/ ,LDOUBLE_HEX(3ffe,c567,2a11,5506,dadd),LDOUBLE_HEX(3fbc,f8ab,4325,9376,7cde) /* ~0.77110541270397041179298150415100110421917634084820 T1[ 16] hi,lo */
/* -48*/ ,LDOUBLE_HEX(3ffe,ff7b,0cff,be15,9675),LDOUBLE_HEX(3fbb,db1c,1100,661d,aecd) /* ~0.99797135585511962475912042802583812317607225850224 T2[ 16] hi,lo */
/* -47*/ ,LDOUBLE_HEX(3ffe,c679,90b5,aa24,5f79),LDOUBLE_HEX(3fbd,aa1c,d161,c55d,84aa) /* ~0.77529243884249997954350233642095702180085936561226 T1[ 17] hi,lo */
/* -47*/ ,LDOUBLE_HEX(3ffe,ff7d,d15b,56e1,ce8b),LDOUBLE_HEX(3fba,a4a7,c651,158b,a410) /* ~0.99801357727017790043245668019089578137936769053339 T2[ 17] hi,lo */
/* -46*/ ,LDOUBLE_HEX(3ffe,c78d,74c8,abb9,b15d),LDOUBLE_HEX(bfbc,fb17,471a,24ff,6207) /* ~0.77950220011891848353015668782184377505473094061017 T1[ 18] hi,lo */
/* -46*/ ,LDOUBLE_HEX(3ffe,ff80,95be,9bb4,c859),LDOUBLE_HEX(bfbc,b742,b767,0074,c32e) /* ~0.99805580047150777505760368968346085694065550342202 T2[ 18] hi,lo */
/* -45*/ ,LDOUBLE_HEX(3ffe,c8a2,d85c,8ffe,2c45),LDOUBLE_HEX(3fbc,c368,d3ed,6e1c,0385) /* ~0.78373481998277644652211096354399444408045383170247 T1[ 19] hi,lo */
/* -45*/ ,LDOUBLE_HEX(3ffe,ff83,5a29,8ca3,c96c),LDOUBLE_HEX(bfbb,a438,6792,f0f4,537c) /* ~0.99809802545918482083280032224337219304288737475872 T2[ 19] hi,lo */
/* -44*/ ,LDOUBLE_HEX(3ffe,c9b9,bd86,6e2f,27a3),LDOUBLE_HEX(bfbd,fe3c,0dab,f5dd,2d04) /* ~0.78799042255394324325455321367250860475905938073992 T1[ 20] hi,lo */
/* -44*/ ,LDOUBLE_HEX(3ffe,ff86,1e9c,29c4,178d),LDOUBLE_HEX(bfbc,db63,47ba,fee3,03cb) /* ~0.99814025223328461320889196106698193489137338474392 T2[ 20] hi,lo */
/* -43*/ ,LDOUBLE_HEX(3ffe,cad2,265e,4290,774e),LDOUBLE_HEX(bfbd,b7c9,6a5f,0390,8383) /* ~0.79226913262624686507939325563754096037882845848798 T1[ 21] hi,lo */
/* -43*/ ,LDOUBLE_HEX(3ffe,ff88,e316,732a,f8bf),LDOUBLE_HEX(bfbc,9a27,1ddb,a851,3860) /* ~0.99818248079388273078091028955860508631303673610091 T2[ 21] hi,lo */
/* -42*/ ,LDOUBLE_HEX(3ffe,cbec,14fe,f272,7c5d),LDOUBLE_HEX(bfba,b6f8,370b,a140,9231) /* ~0.79657107567113344897104590391911926872126059606671 T1[ 22] hi,lo */
/* -42*/ ,LDOUBLE_HEX(3ffe,ff8b,a798,68ed,b341),LDOUBLE_HEX(bfbd,f2fb,91eb,2cdf,6fb7) /* ~0.99822471114105475539649350857906995315715903416275 T2[ 22] hi,lo */
/* -41*/ ,LDOUBLE_HEX(3ffe,cd07,8b86,503d,cdd2),LDOUBLE_HEX(bfbd,ef64,73b9,8c84,14e6) /* ~0.80089637784134667692226977608882521053601521998643 T1[ 23] hi,lo */
/* -41*/ ,LDOUBLE_HEX(3ffe,ff8e,6c22,0b21,8d8b),LDOUBLE_HEX(3fbc,dbab,2022,5186,afc9) /* ~0.99826694327487627199325601057289247819426236674189 T2[ 23] hi,lo */
/* -40*/ ,LDOUBLE_HEX(3ffe,ce24,8c15,1f84,80e4),LDOUBLE_HEX(bfbb,ee53,e383,5069,c895) /* ~0.80524516597462715409606881511450637844973243772983 T1[ 24] hi,lo */
/* -40*/ ,LDOUBLE_HEX(3ffe,ff91,30b3,59db,ce53),LDOUBLE_HEX(3fbd,9ced,2076,73bc,c0c0) /* ~0.99830917719542286886983892268965234961797250434756 T2[ 24] hi,lo */
/* -39*/ ,LDOUBLE_HEX(3ffe,cf43,18cf,1919,18c1),LDOUBLE_HEX(3fbc,994f,1cc9,8dc0,21f2) /* ~0.80961756759743187464176475409693978235736722126603 T1[ 25] hi,lo */
/* -39*/ ,LDOUBLE_HEX(3ffe,ff93,f54c,5531,bc88),LDOUBLE_HEX(3fbc,badb,2327,d830,4c8e) /* ~0.99835141290277013741485956366261689254315569996833 T2[ 25] hi,lo */
/* -38*/ ,LDOUBLE_HEX(3ffe,d063,33da,ef2b,2595),LDOUBLE_HEX(bfbc,a4ae,8e6a,996c,abf8) /* ~0.81401371092867388343282744611606460694019915536046 T1[ 26] hi,lo */
/* -38*/ ,LDOUBLE_HEX(3ffe,ff96,b9ec,fd38,9f54),LDOUBLE_HEX(3fbc,deab,3cf6,1b93,876b) /* ~0.99839365039699367221533166105729151240666396915912 T2[ 26] hi,lo */
/* -37*/ ,LDOUBLE_HEX(3ffe,d184,df62,5169,9ac6),LDOUBLE_HEX(3fba,b8fb,b86d,56aa,3fd1) /* ~0.81843372488348224388140378371403471646772231906652 T1[ 27] hi,lo */
/* -37*/ ,LDOUBLE_HEX(3ffe,ff99,7e95,5205,be1d),LDOUBLE_HEX(bfbc,de71,2326,2868,54d2) /* ~0.99843588967816907111087545989569491666770773008465 T2[ 27] hi,lo */
/* -36*/ ,LDOUBLE_HEX(3ffe,d2a8,1d91,f12a,e45a),LDOUBLE_HEX(3fbb,9124,72be,1ef2,0143) /* ~0.82287773907698242225553647566371751054248306900262 T1[ 28] hi,lo */
/* -36*/ ,LDOUBLE_HEX(3ffe,ff9c,4345,53ae,6082),LDOUBLE_HEX(3fbc,fe9f,77a5,1aa2,3b01) /* ~0.99847813074637193503108739678353344970673788338899 T2[ 28] hi,lo */
/* -35*/ ,LDOUBLE_HEX(3ffe,d3cc,f099,859a,c379),LDOUBLE_HEX(3fbd,dfb2,b158,f1a9,8797) /* ~0.82734588382809719876243362279844006934581557288765 T1[ 29] hi,lo */
/* -35*/ ,LDOUBLE_HEX(3ffe,ff9f,07fd,0247,ce60),LDOUBLE_HEX(bfb8,da60,27f4,240a,2f75) /* ~0.99852037360167786826659064303157720132730901241302 T2[ 29] hi,lo */
/* -34*/ ,LDOUBLE_HEX(3ffe,d4f3,5aab,cfed,fa1f),LDOUBLE_HEX(3fbd,b243,bdff,4c4c,58b5) /* ~0.83183829016336821750429372790414106475509470328688 T1[ 30] hi,lo */
/* -34*/ ,LDOUBLE_HEX(3ffe,ffa1,ccbc,5de7,4fcc),LDOUBLE_HEX(3fbd,be96,9b04,c127,0421) /* ~0.99856261824416247814377445291000867655384354293346 T2[ 30] hi,lo */
/* -33*/ ,LDOUBLE_HEX(3ffe,d61b,5dfe,9f9b,ce07),LDOUBLE_HEX(bfbc,8d32,b9db,3407,1837) /* ~0.83635508982079828681687957980805947499902686104178 T1[ 31] hi,lo */
/* -33*/ ,LDOUBLE_HEX(3ffe,ffa4,9183,66a2,2d19),LDOUBLE_HEX(bfbc,d9f7,dc7c,8136,fec5) /* ~0.99860486467390137535005481539407412583386758342385 T2[ 31] hi,lo */
/* -32*/ ,LDOUBLE_HEX(3ffe,d744,fcca,d69d,6af4),LDOUBLE_HEX(3fbc,e69a,2ee6,40b4,ff78) /* ~0.84089641525371454301891749327779734812793321907520 T1[ 32] hi,lo */
/* -32*/ ,LDOUBLE_HEX(3ffe,ffa7,5652,1c8d,aed2),LDOUBLE_HEX(bfbd,c18b,c96e,08d6,74ee) /* ~0.99864711289097017360861380241843221483577508479356 T2[ 32] hi,lo */
/* -31*/ ,LDOUBLE_HEX(3ffe,d870,394c,6db3,2c84),LDOUBLE_HEX(3fbc,8559,bf8d,ed94,1cbc) /* ~0.84546239963465259097986914671452041147858835756778 T1[ 33] hi,lo */
/* -31*/ ,LDOUBLE_HEX(3ffe,ffaa,1b28,7fbf,1dbe),LDOUBLE_HEX(3fbd,8eb4,6838,bb56,a087) /* ~0.99868936289544448989524000337425491125031840056180 T2[ 33] hi,lo */
/* -30*/ ,LDOUBLE_HEX(3ffe,d99d,15c2,78af,d7b6),LDOUBLE_HEX(bfb7,bc61,09ae,0f6a,2a20) /* ~0.85005317685926173475099293375123465921205934137105 T1[ 34] hi,lo */
/* -30*/ ,LDOUBLE_HEX(3ffe,ffac,e006,904b,c2e1),LDOUBLE_HEX(3fbc,b14f,99ba,f83d,8dd4) /* ~0.99873161468739994449253863373350270649098092690110 T2[ 34] hi,lo */
/* -29*/ ,LDOUBLE_HEX(3ffe,dacb,946f,2ac9,cc72),LDOUBLE_HEX(bfbc,efdd,dd36,f187,1d1c) /* ~0.85466888155023141356459587258953547461715061217546 T1[ 35] hi,lo */
/* -29*/ ,LDOUBLE_HEX(3ffe,ffaf,a4ec,4e48,e778),LDOUBLE_HEX(bfbd,8671,6e2d,8219,1444) /* ~0.99877386826691216077309110055182372889248654246330 T2[ 35] hi,lo */
/* -28*/ ,LDOUBLE_HEX(3ffe,dbfb,b797,daf2,3755),LDOUBLE_HEX(3fbc,f610,356a,78a6,a991) /* ~0.85930964906123895780164570479264796176721574738621 T1[ 36] hi,lo */
/* -28*/ ,LDOUBLE_HEX(3ffe,ffb2,69d9,b9cb,d4fa),LDOUBLE_HEX(3fbd,d84d,2ee6,e8d4,d3b8) /* ~0.99881612363405676525366511109282896541117224842309 T2[ 36] hi,lo */
/* -27*/ ,LDOUBLE_HEX(3ffe,dd2d,8185,0832,4c20),LDOUBLE_HEX(3fbd,cb3c,6af5,b47f,2972) /* ~0.86397561548091878110000596535655859042890369892120 T1[ 37] hi,lo */
/* -27*/ ,LDOUBLE_HEX(3ffe,ffb5,2ece,d2e9,d51d),LDOUBLE_HEX(bfbd,994c,52bb,c51e,a42f) /* ~0.99885838078890938786626521594946837012685136869549 T2[ 37] hi,lo */
/* -26*/ ,LDOUBLE_HEX(3ffe,de60,f482,5e0e,9124),LDOUBLE_HEX(bfbc,8be1,7498,5ee6,5e9c) /* ~0.86866691763685312450450626275966214961954392492771 T1[ 38] hi,lo */
/* -26*/ ,LDOUBLE_HEX(3ffe,ffb7,f3cb,99b8,31cd),LDOUBLE_HEX(3fbb,8b13,c75c,9907,9d08) /* ~0.99890063973154566147024183142555386893945978954434 T2[ 38] hi,lo */
/* -25*/ ,LDOUBLE_HEX(3ffe,df96,12de,b8f0,4420),LDOUBLE_HEX(3fbd,8d70,2518,e344,9fa0) /* ~0.87338369309958447002373294054677899111993610858917 T1[ 39] hi,lo */
/* -25*/ ,LDOUBLE_HEX(3ffe,ffba,b8d0,0e4c,3535),LDOUBLE_HEX(3fba,bff0,5a1f,2fe7,8cc7) /* ~0.99894290046204122234018221715423635487240971997380 T2[ 39] hi,lo */
/* -24*/ ,LDOUBLE_HEX(3ffe,e0cc,deec,2a94,e111),LDOUBLE_HEX(3fb9,cb12,a091,ba66,7944) /* ~0.87812608018664974155473648687042498295340919867157 T1[ 40] hi,lo */
/* -24*/ ,LDOUBLE_HEX(3ffe,ffbd,7ddc,30bb,29b9),LDOUBLE_HEX(3fbc,c13b,06cc,24fb,adcf) /* ~0.99898516298047170984064982435235435787035385146737 T2[ 40] hi,lo */
/* -23*/ ,LDOUBLE_HEX(3ffe,e205,5aff,fe83,d369),LDOUBLE_HEX(bfbd,b207,df0e,7d75,ac99) /* ~0.88289421796663641054054086354518915413791546598076 T1[ 41] hi,lo */
/* -23*/ ,LDOUBLE_HEX(3ffe,ffc0,42f0,011a,59f9),LDOUBLE_HEX(3fbb,9baa,d16f,ffef,fe31) /* ~0.99902742728691276658881462169325970990030327811837 T2[ 41] hi,lo */
/* -22*/ ,LDOUBLE_HEX(3ffe,e33f,8972,be8a,5a51),LDOUBLE_HEX(3fba,9bfe,9079,5980,eecf) /* ~0.88768824626326062627321503151200943193543935194611 T1[ 42] hi,lo */
/* -22*/ ,LDOUBLE_HEX(3ffe,ffc3,080b,7f7f,10cf),LDOUBLE_HEX(3fbd,a67d,211d,b089,b842) /* ~0.99906969338144003834603287805826710155088221654295 T2[ 42] hi,lo */
/* -21*/ ,LDOUBLE_HEX(3ffe,e47b,6ca0,373d,a88d),LDOUBLE_HEX(3fbd,cbc4,8805,c442,ddb5) /* ~0.89250830565946749005053553749355899071815656498074 T1[ 43] hi,lo */
/* -21*/ ,LDOUBLE_HEX(3ffe,ffc5,cd2e,abfe,9952),LDOUBLE_HEX(bfbd,d27c,2e60,9c60,e59f) /* ~0.99911196126412917418047748840947974713344592601060 T2[ 43] hi,lo */
/* -20*/ ,LDOUBLE_HEX(3ffe,e5b9,06e7,7c83,48a8),LDOUBLE_HEX(3fbb,f2f4,7a52,76dd,8765) /* ~0.89735453750155359320742065598608405707636848092079 T1[ 44] hi,lo */
/* -20*/ ,LDOUBLE_HEX(3ffe,ffc8,9259,86ae,3ed1),LDOUBLE_HEX(bfbd,e1f3,4d80,330a,7c7d) /* ~0.99915423093505582619608743066841327618021750822663 T2[ 44] hi,lo */
/* -19*/ ,LDOUBLE_HEX(3ffe,e6f8,5aaa,ee1f,ce22),LDOUBLE_HEX(3fbd,f895,8fac,51be,5160) /* ~0.90222708390331194012751875321853844980068970471620 T1[ 45] hi,lo */
/* -19*/ ,LDOUBLE_HEX(3ffe,ffcb,578c,0fa3,4cd8),LDOUBLE_HEX(bfba,85a0,3df0,1bbe,480e) /* ~0.99919650239429564980361830883737184194615110754966 T2[ 45] hi,lo */
/* -18*/ ,LDOUBLE_HEX(3ffe,e839,6a50,3c4b,dc68),LDOUBLE_HEX(3fbd,f22f,21a1,58e1,8fbc) /* ~0.90712608775019937809927506044971323717618361115455 T1[ 46] hi,lo */
/* -18*/ ,LDOUBLE_HEX(3ffe,ffce,1cc6,46f3,0f2f),LDOUBLE_HEX(bfbd,d11c,79ec,fe71,2113) /* ~0.99923877564192430366643224437517289970855927094817 T2[ 46] hi,lo */
/* -17*/ ,LDOUBLE_HEX(3ffe,e97c,3840,6c4f,8c57),LDOUBLE_HEX(bfba,f6e3,3b0a,efed,259d) /* ~0.91205169270352665550133028360413334212353220209479 T1[ 47] hi,lo */
/* -17*/ ,LDOUBLE_HEX(3ffe,ffd0,e208,2cb2,d1d6),LDOUBLE_HEX(3fbd,822a,581b,5246,bdac) /* ~0.99928105067801744948365744170004631996562238782644 T2[ 47] hi,lo */
/* -16*/ ,LDOUBLE_HEX(3ffe,eac0,c6e7,dd24,392f),LDOUBLE_HEX(bfbc,bf4a,2932,3e46,ac15) /* ~0.91700404320467123175366838672140090693574165925383 T1[ 48] hi,lo */
/* -16*/ ,LDOUBLE_HEX(3ffe,ffd3,a751,c0f7,e10c),LDOUBLE_HEX(bfbc,b118,1d47,fb41,07e6) /* ~0.99932332750265075236965894855956094033899717032909 T2[ 48] hi,lo */
/* -15*/ ,LDOUBLE_HEX(3ffe,ec07,18b6,4c1c,bddc),LDOUBLE_HEX(3fbc,9f3a,0910,0bf0,97d9) /* ~0.92198328447931296252514099531794045105925761163234 T1[ 49] hi,lo */
/* -15*/ ,LDOUBLE_HEX(3ffe,ffd6,6ca3,03d7,8947),LDOUBLE_HEX(3fbc,eeaf,9a2f,a3c1,3789) /* ~0.99936560611589988042035778703642279197083553299307 T2[ 49] hi,lo */
/* -14*/ ,LDOUBLE_HEX(3ffe,ed4f,301e,d994,2b84),LDOUBLE_HEX(3fbd,c01a,5b6d,4c97,f624) /* ~0.92698956254169278417588684337857785067171789705753 T1[ 50] hi,lo */
/* -14*/ ,LDOUBLE_HEX(3ffe,ffd9,31fb,f567,173b),LDOUBLE_HEX(3fbd,e5f8,d3c8,1e5c,b0b2) /* ~0.99940788651784050509270171391840165142639307305216 T2[ 50] hi,lo */
/* -13*/ ,LDOUBLE_HEX(3ffe,ee99,0f98,0da3,025b),LDOUBLE_HEX(3fbd,95de,3c06,30a3,9321) /* ~0.93202302419889452238894664293233915941527811810374 T1[ 51] hi,lo */
/* -13*/ ,LDOUBLE_HEX(3ffe,ffdb,f75c,95bb,d7d7),LDOUBLE_HEX(bfbd,fbb3,2c62,3fb8,60df) /* ~0.99945016870854830104203489482550537559291115030646 T2[ 51] hi,lo */
/* -12*/ ,LDOUBLE_HEX(3ffe,efe4,b99b,dcda,f5cb),LDOUBLE_HEX(3fbd,8cac,39ed,291b,7226) /* ~0.93708381705514995065010516728243317174928961321711 T1[ 52] hi,lo */
/* -12*/ ,LDOUBLE_HEX(3ffe,ffde,bcc4,e4eb,1842),LDOUBLE_HEX(bfbd,fe9c,0372,21ba,c7cf) /* ~0.99949245268809894595946757833715423657849896699190 T2[ 52] hi,lo */
/* -11*/ ,LDOUBLE_HEX(3ffe,f132,30a7,ad09,4509),LDOUBLE_HEX(3fbc,ec3f,42f5,b4c8,cfcf) /* ~0.94217208951616722483130353382740906909020850434899 T1[ 53] hi,lo */
/* -11*/ ,LDOUBLE_HEX(3ffe,ffe1,8234,e30a,25e1),LDOUBLE_HEX(bfbd,d44f,a015,3fba,570a) /* ~0.99953473845656812089713674773783225191436940804123 T2[ 53] hi,lo */
/* -10*/ ,LDOUBLE_HEX(3ffe,f281,773c,59ff,b13a),LDOUBLE_HEX(bfbb,bb3f,ab19,b85c,2da7) /* ~0.94728799079348282067506575865323270591034088283777 T1[ 54] hi,lo */
/* -10*/ ,LDOUBLE_HEX(3ffe,ffe4,47ac,902e,4e53),LDOUBLE_HEX(bfb9,db28,c775,3bab,3e53) /* ~0.99957702601403151005136568651998629775334848091006 T2[ 54] hi,lo */
/* -9*/ ,LDOUBLE_HEX(3ffe,f3d2,8fde,3a64,1a5b),LDOUBLE_HEX(bfbd,b74d,7cdc,8798,a758) /* ~0.95243167090883710184474539306442864017299143597483 T1[ 55] hi,lo */
/* -9*/ ,LDOUBLE_HEX(3ffe,ffe7,0d2b,ec6c,df73),LDOUBLE_HEX(bfba,cdc3,3c89,4bd3,b790) /* ~0.99961931536056480087108419563257655227062059566378 T2[ 55] hi,lo */
/* -8*/ ,LDOUBLE_HEX(3ffe,f525,7d15,2486,cc2c),LDOUBLE_HEX(3fbd,f73a,18f5,db30,1f87) /* ~0.95760328069857364691012946433801289458642713725566 T1[ 56] hi,lo */
/* -8*/ ,LDOUBLE_HEX(3ffe,ffe9,d2b2,f7db,2756),LDOUBLE_HEX(bfbc,8838,b5d7,21d6,f1ce) /* ~0.99966160649624368394940837623252605226298328489065 T2[ 56] hi,lo */
/* -7*/ ,LDOUBLE_HEX(3ffe,f67a,416c,733f,846e),LDOUBLE_HEX(bfbd,fced,046b,6310,b9e0) /* ~0.96280297181806246450529868097234498236502986401319 T1[ 57] hi,lo */
/* -7*/ ,LDOUBLE_HEX(3ffe,ffec,9841,b28e,744c),LDOUBLE_HEX(3fbc,97cc,e653,acf3,2bde) /* ~0.99970389942114385307785073830899591484921984374523 T2[ 57] hi,lo */
/* -6*/ ,LDOUBLE_HEX(3ffe,f7d0,df73,0ad1,3bb9),LDOUBLE_HEX(bfb7,b795,b494,f824,8a8b) /* ~0.96803089674614722529933166783600029248191276565194 T1[ 58] hi,lo */
/* -6*/ ,LDOUBLE_HEX(3ffe,ffef,5dd8,1c9c,14e1),LDOUBLE_HEX(3fbd,94dc,70ee,035c,489a) /* ~0.99974619413534100530053030930766055917047196999192 T2[ 58] hi,lo */
/* -5*/ ,LDOUBLE_HEX(3ffe,f929,59bb,5dd4,ba74),LDOUBLE_HEX(3fbc,d2df,86c7,21a9,8d5b) /* ~0.97328720878961664316093849169675422672298736870288 T1[ 59] hi,lo */
/* -5*/ ,LDOUBLE_HEX(3ffe,fff2,2376,3619,57dc),LDOUBLE_HEX(bfbc,873d,93df,ba07,4a3e) /* ~0.99978849063891084085996252550643248468986712396144 T2[ 59] hi,lo */
/* -4*/ ,LDOUBLE_HEX(3ffe,fa83,b2db,722a,033a),LDOUBLE_HEX(3fbd,f84b,7628,62ba,ff99) /* ~0.97857206208770013448287189428143051372899208217859 T1[ 60] hi,lo */
/* -4*/ ,LDOUBLE_HEX(3ffe,fff4,e91b,ff1b,8c3e),LDOUBLE_HEX(bfbd,ef98,e3e2,81af,6b64) /* ~0.99983078893192906314284912339118704949214588850736 T2[ 60] hi,lo */
/* -3*/ ,LDOUBLE_HEX(3ffe,fbdf,ed6c,e5f0,9c49),LDOUBLE_HEX(bfbd,c4b4,018d,426a,3a32) /* ~0.98388561161658788907719355720793430464254925027489 T1[ 61] hi,lo */
/* -3*/ ,LDOUBLE_HEX(3ffe,fff7,aec9,77b8,0143),LDOUBLE_HEX(3fb9,87ed,a7ba,da2f,9976) /* ~0.99987308901447137873428824828003769198403460904955 T2[ 61] hi,lo */
/* -2*/ ,LDOUBLE_HEX(3ffe,fd3e,0c0c,f486,c175),LDOUBLE_HEX(bfbd,f581,8b4d,9c3e,23fa) /* ~0.98922801319397548415511892128115789546427549794316 T1[ 62] hi,lo */
/* -2*/ ,LDOUBLE_HEX(3ffe,fffa,747e,a004,0664),LDOUBLE_HEX(3fbc,8e3e,4bde,4901,6016) /* ~0.99991539088661349752619467157188637429499067366123 T2[ 62] hi,lo */
/* -1*/ ,LDOUBLE_HEX(3ffe,fe9e,115c,7b8f,884c),LDOUBLE_HEX(bfbd,a45b,4cd4,30c5,a1ed) /* ~0.99459942348363317566987962248248322794097475707530 T1[ 63] hi,lo */
/* -1*/ ,LDOUBLE_HEX(3ffe,fffd,3a3b,7814,eb54),LDOUBLE_HEX(bfbc,ca27,58a3,c057,ba57) /* ~0.99995769454843113255466946487359791717608459293842 T2[ 63] hi,lo */
/* 0*/ ,LDOUBLE_HEX(3fff,8000,0000,0000,0000),LDOUBLE_HEX(0000,0000,0000,0000,0000) /* 1.0 T1[ 64] hi,lo */
/* 0*/ ,LDOUBLE_HEX(3fff,8000,0000,0000,0000),LDOUBLE_HEX(0000,0000,0000,0000,0000) /* 1.0 T2[ 64] hi,lo */
/* 1*/ ,LDOUBLE_HEX(3fff,80b1,ed4f,d999,ab6c),LDOUBLE_HEX(3fbd,94cd,5c66,db9b,f480) /* ~1.00542990111280282133562891111466797156026586890220 T1[ 65] hi,lo */
/* 1*/ ,LDOUBLE_HEX(3fff,8001,62e6,1bed,4a49),LDOUBLE_HEX(bfbc,bd9e,8f2d,ce5c,6131) /* ~1.00004230724139581934929027484670882586215157061815 T2[ 65] hi,lo */
/* 2*/ ,LDOUBLE_HEX(3fff,8164,d1f3,bc03,0773),LDOUBLE_HEX(3fbe,f7ca,ca4f,7a29,bde9) /* ~1.01088928605170045996793776188482638644927646964788 T1[ 66] hi,lo */
/* 2*/ ,LDOUBLE_HEX(3fff,8002,c5d0,0fdc,fcb7),LDOUBLE_HEX(bfbe,9353,2b4e,7f6e,83c2) /* ~1.00008461627269431323383058751730345647956710308790 T2[ 66] hi,lo */
/* 3*/ ,LDOUBLE_HEX(3fff,8218,af43,73fc,25ec),LDOUBLE_HEX(bfbe,c706,5df2,5b81,9130) /* ~1.01637831491095303798263826955405875196447595953941 T1[ 67] hi,lo */
/* 3*/ ,LDOUBLE_HEX(3fff,8004,28bd,dbd9,bf99),LDOUBLE_HEX(3fbb,d289,3e85,affc,a646) /* ~1.00012692709397120742909753632332581219088751822710 T2[ 67] hi,lo */
/* 4*/ ,LDOUBLE_HEX(3fff,82cd,8698,ac2b,a1d7),LDOUBLE_HEX(3fbd,f8a9,1d6d,1948,2ffd) /* ~1.02189714865411667820815216911611855721275787800550 T1[ 68] hi,lo */
/* 4*/ ,LDOUBLE_HEX(3fff,8005,8baf,7fee,3b5d),LDOUBLE_HEX(3fbc,e38c,59c7,2a4e,5c9a) /* ~1.00016923970530223107159445428138155875785741955041 T2[ 68] hi,lo */
/* 5*/ ,LDOUBLE_HEX(3fff,8383,594e,efb6,ee37),LDOUBLE_HEX(bfbc,eff1,589e,1360,4be1) /* ~1.02744594911876369655156365778836402569140773266553 T1[ 69] hi,lo */
/* 5*/ ,LDOUBLE_HEX(3fff,8006,eea4,fc25,188e),LDOUBLE_HEX(bfbe,be51,bfd6,da9c,50ec) /* ~1.00021155410676311644201097461603922056383453309535 T2[ 69] hi,lo */
/* 6*/ ,LDOUBLE_HEX(3fff,843a,28c3,acde,4046),LDOUBLE_HEX(3fbc,d7c9,7650,9fe8,ac10) /* ~1.03302487902122842248868461734190304923686198890209 T1[ 70] hi,lo */
/* 6*/ ,LDOUBLE_HEX(3fff,8008,519e,5088,ffd3),LDOUBLE_HEX(bfbc,ddbf,fb2a,c38e,3196) /* ~1.00025387029842959885680281351127973721304442733526 T2[ 70] hi,lo */
/* 7*/ ,LDOUBLE_HEX(3fff,84f1,f656,379c,1a29),LDOUBLE_HEX(3fbb,f030,62c2,6b5b,a5d1) /* ~1.03863410196137879060607894787793270552356261759996 T1[ 71] hi,lo */
/* 7*/ ,LDOUBLE_HEX(3fff,8009,b49b,7d24,99f3),LDOUBLE_HEX(bfbe,8364,adc5,5d2d,55af) /* ~1.00029618828037741710187263910469823713356163352727 T2[ 71] hi,lo */
/* 8*/ ,LDOUBLE_HEX(3fff,85aa,c367,cc48,7b15),LDOUBLE_HEX(bfbd,e8da,91cf,7aac,f938) /* ~1.04427378242741384034662083246658426105568651109933 T1[ 72] hi,lo */
/* 8*/ ,LDOUBLE_HEX(3fff,800b,179c,8202,8fd1),LDOUBLE_HEX(bfbe,d743,563a,a3ce,1a20) /* ~1.00033850805268231299888920249330226397432852536439 T2[ 72] hi,lo */
/* 9*/ ,LDOUBLE_HEX(3fff,8664,915b,923f,ba04),LDOUBLE_HEX(bfbd,91f4,8ed8,4742,eaa7) /* ~1.04994408580068726609749174549790495802881196141242 T1[ 73] hi,lo */
/* 9*/ ,LDOUBLE_HEX(3fff,800c,7aa1,5f2d,8a6d),LDOUBLE_HEX(3fbe,b45d,df92,07f3,cad6) /* ~1.00038082961542003151370755498206222000590059906244 T2[ 73] hi,lo */
/* 10*/ ,LDOUBLE_HEX(3fff,871f,6196,9e8d,1010),LDOUBLE_HEX(3fbd,e85c,9f15,ed4a,a559) /* ~1.05564517836055715878373906235765389283187687397003 T1[ 74] hi,lo */
/* 10*/ ,LDOUBLE_HEX(3fff,800d,ddaa,14b0,32e8),LDOUBLE_HEX(bfbe,dbf5,ee63,a474,2c9a) /* ~1.00042315296866632119004991707811313972342759370803 T2[ 74] hi,lo */
/* 11*/ ,LDOUBLE_HEX(3fff,87db,357f,f698,d792),LDOUBLE_HEX(bfbe,df6e,2275,ebd9,aeb2) /* ~1.06137722728926208099788086602899284116574563086032 T1[ 75] hi,lo */
/* 11*/ ,LDOUBLE_HEX(3fff,800f,40b6,a295,327b),LDOUBLE_HEX(3fbe,9a11,8af4,78f3,787d) /* ~1.00046547811249693317372372325380069923994597047567 T2[ 75] hi,lo */
/* 12*/ ,LDOUBLE_HEX(3fff,8898,0e80,92da,8527),LDOUBLE_HEX(3fbe,bbf1,aed9,318c,eac6) /* ~1.06714040067682361812972241521535465835768263787031 T1[ 76] hi,lo */
/* 12*/ ,LDOUBLE_HEX(3fff,8010,a3c7,08e7,3282),LDOUBLE_HEX(3fbd,ae5b,58b5,4705,681e) /* ~1.00050780504698762240524401168073609369457699358463 T2[ 76] hi,lo */
/* 13*/ ,LDOUBLE_HEX(3fff,8955,ee03,618e,5fdd),LDOUBLE_HEX(bfbe,d452,cdb2,971d,08d9) /* ~1.07293486752597555142999669053338607227487955242395 T1[ 77] hi,lo */
/* 13*/ ,LDOUBLE_HEX(3fff,8012,06db,47b0,dc73),LDOUBLE_HEX(3fbe,bb24,d6a1,6ac0,de44) /* ~1.00055013377221414664405146899284204664581920951604 T2[ 77] hi,lo */
/* 14*/ ,LDOUBLE_HEX(3fff,8a14,d575,496e,fd9a),LDOUBLE_HEX(3fbb,80ca,1d92,c368,0c22) /* ~1.07876079775711979373727100739444040300440974533557 T1[ 78] hi,lo */
/* 14*/ ,LDOUBLE_HEX(3fff,8013,69f3,5efc,d9e4),LDOUBLE_HEX(bfbe,ba91,a929,afe6,0b3f) /* ~1.00059246428825226711903373377765547047602012753486 T2[ 78] hi,lo */
/* 15*/ ,LDOUBLE_HEX(3fff,8ad4,c645,2c72,8924),LDOUBLE_HEX(3fba,d573,dd56,13bf,92a3) /* ~1.08461836221330923781328015031988343253033235669136 T1[ 79] hi,lo */
/* 15*/ ,LDOUBLE_HEX(3fff,8014,cd0f,4ed5,d485),LDOUBLE_HEX(3fbe,95d6,5430,ec64,68fa) /* ~1.00063479659517774787800409308502480598690453916788 T2[ 79] hi,lo */
/* 16*/ ,LDOUBLE_HEX(3fff,8b95,c1e3,ea8b,d6e7),LDOUBLE_HEX(bfba,8373,af14,eb58,6dfd) /* ~1.09050773266525765920875040704274283598351757973432 T1[ 80] hi,lo */
/* 16*/ ,LDOUBLE_HEX(3fff,8016,302f,1746,7628),LDOUBLE_HEX(3fbd,da43,7f91,3447,4021) /* ~1.00067713069306635665506322041551356960553675889968 T2[ 80] hi,lo */
/* 17*/ ,LDOUBLE_HEX(3fff,8c57,c9c4,646f,4dde),LDOUBLE_HEX(bfba,8f46,5c3d,afa3,6840) /* ~1.09642908181637682338803452264386351089342497289180 T1[ 81] hi,lo */
/* 17*/ ,LDOUBLE_HEX(3fff,8017,9352,b859,68ba),LDOUBLE_HEX(bfbd,a49b,73de,ad19,46f2) /* ~1.00071946658199386411165765498054724957910366356372 T2[ 81] hi,lo */
/* 18*/ ,LDOUBLE_HEX(3fff,8d1a,df5b,7e5b,a9e6),LDOUBLE_HEX(bfbe,9670,96d2,e37c,a594) /* ~1.10238258330784094358827107651421783884870819747447 T1[ 82] hi,lo */
/* 18*/ ,LDOUBLE_HEX(3fff,8018,f67a,3219,5645),LDOUBLE_HEX(3fbd,b854,8436,4510,af0d) /* ~1.00076180426203604405342023619951419277640525251626 T2[ 82] hi,lo */
/* 19*/ ,LDOUBLE_HEX(3fff,8ddf,0420,22e6,9cd6),LDOUBLE_HEX(bfbe,e18d,4bbd,81ca,0653) /* ~1.10836841172367863805718612990602878198842518031597 T1[ 83] hi,lo */
/* 19*/ ,LDOUBLE_HEX(3fff,801a,59a5,8490,e8f3),LDOUBLE_HEX(bfbd,bfde,9abb,c89b,4566) /* ~1.00080414373326867375543075544541693489009048789739 T2[ 83] hi,lo */
/* 20*/ ,LDOUBLE_HEX(3fff,8ea4,398b,45cd,53c0),LDOUBLE_HEX(3fbd,b700,5132,1e0f,5317) /* ~1.11438674259589253628943694707231770735234022140502 T1[ 84] hi,lo */
/* 20*/ ,LDOUBLE_HEX(3fff,801b,bcd4,afca,cb09),LDOUBLE_HEX(bfbc,ee2b,3ca1,60ce,c87d) /* ~1.00084648499576753342011486980211998343293089419603 T2[ 84] hi,lo */
/* 21*/ ,LDOUBLE_HEX(3fff,8f6a,8117,e6c8,e5c4),LDOUBLE_HEX(3fbb,cffb,0890,e8f2,826a) /* ~1.12043775240960668442349867923724104912253096699714 T1[ 85] hi,lo */
/* 21*/ ,LDOUBLE_HEX(3fff,801d,2007,b3d1,a6eb),LDOUBLE_HEX(3fbc,e24f,a3f1,8819,c368) /* ~1.00088882804960840661092497105855159134080167859792 T2[ 85] hi,lo */
/* 22*/ ,LDOUBLE_HEX(3fff,9031,dc43,1466,b1dc),LDOUBLE_HEX(3fbe,eeb0,2950,929d,0fc5) /* ~1.12652161860824189974425446614247903198702260851860 T1[ 86] hi,lo */
/* 22*/ ,LDOUBLE_HEX(3fff,801e,833e,90b0,271b),LDOUBLE_HEX(bfbd,df0c,d686,c810,ce9e) /* ~1.00093117289486708014391996846015331357193645089864 T2[ 86] hi,lo */
/* 23*/ ,LDOUBLE_HEX(3fff,90fa,4c8b,eee4,b12b),LDOUBLE_HEX(bfbe,d02d,6d6b,424b,49e1) /* ~1.13263851959871922803115701361420519788225647062063 T1[ 87] hi,lo */
/* 23*/ ,LDOUBLE_HEX(3fff,801f,e679,4670,f637),LDOUBLE_HEX(bfbd,f4b1,1157,9a3c,c09c) /* ~1.00097351953161934387092485421177912030543666332960 T2[ 87] hi,lo */
/* 24*/ ,LDOUBLE_HEX(3fff,91c3,d373,ab11,c336),LDOUBLE_HEX(3fbb,fd6d,8e0a,e5ac,9d82) /* ~1.13878863475669165369712210189589995934511534869670 T1[ 88] hi,lo */
/* 24*/ ,LDOUBLE_HEX(3fff,8021,49b7,d51e,befb),LDOUBLE_HEX(3fbe,f7b7,5b79,1115,d652) /* ~1.00101586795994099089637113797479628374276217073202 T2[ 88] hi,lo */
/* 25*/ ,LDOUBLE_HEX(3fff,928e,727d,9531,f9ac),LDOUBLE_HEX(3fbc,aadf,7a7a,5204,6a72) /* ~1.14497214443180421938536794890239889355143532156944 T1[ 89] hi,lo */
/* 25*/ ,LDOUBLE_HEX(3fff,8022,acfa,3cc4,2c43),LDOUBLE_HEX(bfbb,9803,679c,fccf,bd52) /* ~1.00105821817990781779413728136418626490922179073095 T2[ 89] hi,lo */
/* 26*/ ,LDOUBLE_HEX(3fff,935a,2b2f,13e6,e92c),LDOUBLE_HEX(bfbd,b319,afc5,89b6,c463) /* ~1.15118922995298270583672262112884254747768864035606 T1[ 90] hi,lo */
/* 26*/ ,LDOUBLE_HEX(3fff,8024,1040,7d6b,e905),LDOUBLE_HEX(bfbd,d992,0edb,1ae2,6862) /* ~1.00110057019159562395702739445724205324950162321329 T2[ 90] hi,lo */
/* 27*/ ,LDOUBLE_HEX(3fff,9426,ff0f,ab1c,04b6),LDOUBLE_HEX(3fbe,f15c,f03c,a096,7fdb) /* ~1.15744007363375102956197515435832201546872965991497 T1[ 91] hi,lo */
/* 27*/ ,LDOUBLE_HEX(3fff,8025,738a,9720,a056),LDOUBLE_HEX(3fbd,8031,e4e2,c90f,b56a) /* ~1.00114292399508021213887232203632038363139145076274 T2[ 91] hi,lo */
/* 28*/ ,LDOUBLE_HEX(3fff,94f4,efa8,fef7,0961),LDOUBLE_HEX(3fbd,ba2b,eb44,9547,7951) /* ~1.16372485877757751379386191858955612588033545762300 T1[ 92] hi,lo */
/* 28*/ ,LDOUBLE_HEX(3fff,8026,d6d8,89ec,fd6a),LDOUBLE_HEX(bfbe,8df6,8809,7e58,ba93) /* ~1.00118527959043738845452964358884173634578473865985 T2[ 92] hi,lo */
/* 29*/ ,LDOUBLE_HEX(3fff,95c3,fe86,d6cc,7fef),LDOUBLE_HEX(bfbb,adcd,6381,aa3b,dde8) /* ~1.17004376968325018808485954435738563006452750414609 T1[ 93] hi,lo */
/* 29*/ ,LDOUBLE_HEX(3fff,8028,3a2a,55db,ab90),LDOUBLE_HEX(bfbc,bd1b,9f76,51ee,96be) /* ~1.00122763697774296194620280431308856350369751453399 T2[ 93] hi,lo */
/* 30*/ ,LDOUBLE_HEX(3fff,9694,2d37,2018,5a00),LDOUBLE_HEX(3fbe,91d5,36d0,7538,458a) /* ~1.17639699165028127625376441756088752299547195434570 T1[ 94] hi,lo */
/* 30*/ ,LDOUBLE_HEX(3fff,8029,9d7f,faf7,5637),LDOUBLE_HEX(bfbe,d236,fdc3,f478,d426) /* ~1.00126999615707274512554220136095750603999476879835 T2[ 94] hi,lo */
/* 31*/ ,LDOUBLE_HEX(3fff,9765,7d49,f17a,b08e),LDOUBLE_HEX(3fbe,a0f4,5d52,3833,af61) /* ~1.18278471098434102989037375319725242661661468446254 T1[ 95] hi,lo */
/* 31*/ ,LDOUBLE_HEX(3fff,802b,00d9,794a,a8e9),LDOUBLE_HEX(3fbe,856f,102a,5311,acd9) /* ~1.00131235712850255343154409759520717670966405421495 T2[ 95] hi,lo */
/* 32*/ ,LDOUBLE_HEX(3fff,9837,f051,8db8,a96f),LDOUBLE_HEX(3fbe,8d5a,4630,5c85,eded) /* ~1.18920711500272106668756738612202639160386752337217 T1[ 96] hi,lo */
/* 32*/ ,LDOUBLE_HEX(3fff,802c,6436,d0e0,4f51),LDOUBLE_HEX(bfb6,e62d,6b30,d098,6397) /* ~1.00135471989210820588107192508076082049228716641664 T2[ 96] hi,lo */
/* 33*/ ,LDOUBLE_HEX(3fff,990b,87e2,66c1,89aa),LDOUBLE_HEX(bfbd,c61c,79fe,e0f2,443a) /* ~1.19566439203982737460481289293312556765158660709857 T1[ 97] hi,lo */
/* 33*/ ,LDOUBLE_HEX(3fff,802d,c798,01c2,f534),LDOUBLE_HEX(3fbe,ee14,9ecb,14b8,e2d1) /* ~1.00139708444796552430991476434485321078682318329811 T2[ 97] hi,lo */
/* 34*/ ,LDOUBLE_HEX(3fff,99e0,4593,20b7,fa65),LDOUBLE_HEX(bfbc,de7b,c9a6,5a50,1a8c) /* ~1.20215673145270314210817513833617908858286682516336 T1[ 98] hi,lo */
/* 34*/ ,LDOUBLE_HEX(3fff,802f,2afd,0bfd,4678),LDOUBLE_HEX(bfbc,b751,8633,d8a0,aeca) /* ~1.00143945079615033413172886511688375321682542562484 T2[ 98] hi,lo */
/* 35*/ ,LDOUBLE_HEX(3fff,9ab6,2afc,94ff,864a),LDOUBLE_HEX(3fbd,c468,ec6e,75e7,1adb) /* ~1.20868432362658157733399655331396616020356304943561 T1[ 99] hi,lo */
/* 35*/ ,LDOUBLE_HEX(3fff,8030,8e65,ef99,ef1d),LDOUBLE_HEX(3fbd,b09f,c1fc,23b2,9fab) /* ~1.00148181893673846357909612558856338182522449642419 T2[ 99] hi,lo */
/* 36*/ ,LDOUBLE_HEX(3fff,9b8d,39b9,d54e,5539),LDOUBLE_HEX(bfbe,baaf,d0ba,b867,81c2) /* ~1.21524735998046887815605271443430979161348659545183 T1[100] hi,lo */
/* 36*/ ,LDOUBLE_HEX(3fff,8031,f1d2,aca3,9b44),LDOUBLE_HEX(bfbe,a4c4,911a,dfc4,d295) /* ~1.00152418886980574446246561315376766287954524159431 T2[100] hi,lo */
/* 37*/ ,LDOUBLE_HEX(3fff,9c65,7368,2ec3,2c2d),LDOUBLE_HEX(3fbe,9cb0,d9be,d0c8,53bd) /* ~1.22184603297275751687071126960759670510014984756708 T1[101] hi,lo */
/* 37*/ ,LDOUBLE_HEX(3fff,8033,5543,4324,f728),LDOUBLE_HEX(3fbe,e415,5eab,b7e1,f081) /* ~1.00156656059542801141121204366868369106668978929519 T2[101] hi,lo */
/* 38*/ ,LDOUBLE_HEX(3fff,9d3e,d9a7,2cff,b751),LDOUBLE_HEX(bfbd,86da,cc3e,bc59,93d4) /* ~1.22848053610687000570828725232175315795757342129945 T1[102] hi,lo */
/* 38*/ ,LDOUBLE_HEX(3fff,8034,b8b7,b328,af26),LDOUBLE_HEX(3fbc,ac57,aea7,6d92,1bde) /* ~1.00160893411368110274099751944021363669889979064464 T2[102] hi,lo */
/* 39*/ ,LDOUBLE_HEX(3fff,9e19,6e18,9d47,2420),LDOUBLE_HEX(3fb7,f914,5ac7,9bba,f035) /* ~1.23515106393693330569250043993179133394733071327209 T1[103] hi,lo */
/* 39*/ ,LDOUBLE_HEX(3fff,8036,1c2f,fcb9,6fb5),LDOUBLE_HEX(bfbd,cfaa,e2c6,1949,76e1) /* ~1.00165130942464085958640979123757119850779417902231 T2[103] hi,lo */
/* 40*/ ,LDOUBLE_HEX(3fff,9ef5,3260,91a1,11ae),LDOUBLE_HEX(bfbe,bedd,c1ec,288c,045d) /* ~1.24185781207348404863409496723392066996893845498561 T1[104] hi,lo */
/* 40*/ ,LDOUBLE_HEX(3fff,8037,7fac,1fe1,e56a),LDOUBLE_HEX(3fbe,c39a,17ff,af9f,8d06) /* ~1.00169368652838312633464312728648337724735029041767 T2[104] hi,lo */
/* 41*/ ,LDOUBLE_HEX(3fff,9fd2,2825,6400,dd06),LDOUBLE_HEX(bfba,8fe5,5be7,cd04,73e3) /* ~1.24860097718920473662367054412669631346943788230419 T1[105] hi,lo */
/* 41*/ ,LDOUBLE_HEX(3fff,8038,e32c,1cac,bcfa),LDOUBLE_HEX(3fbd,ed51,9851,d0d3,59b7) /* ~1.00173606542498375084233874776629136249539442360401 T2[105] hi,lo */
/* 42*/ ,LDOUBLE_HEX(3fff,a0b0,510f,b971,4fc2),LDOUBLE_HEX(3fbc,c96e,3cf6,d87e,cd4c) /* ~1.25538075702469108956872700932905217996449209749698 T1[106] hi,lo */
/* 42*/ ,LDOUBLE_HEX(3fff,803a,46af,f324,a335),LDOUBLE_HEX(3fbe,ac3c,8131,843a,6e57) /* ~1.00177844611451858389348373856719831564987543970346 T2[106] hi,lo */
/* 43*/ ,LDOUBLE_HEX(3fff,a18f,aeca,8544,b6e4),LDOUBLE_HEX(bfbe,fbbc,6bef,3313,7e1e) /* ~1.26219735039425070806731743466855277802096679806709 T1[107] hi,lo */
/* 43*/ ,LDOUBLE_HEX(3fff,803b,aa37,a354,450a),LDOUBLE_HEX(3fbe,9180,bea1,677e,0605) /* ~1.00182082859706347963309192028447114353184588253498 T2[107] hi,lo */
/* 44*/ ,LDOUBLE_HEX(3fff,a270,4303,0c49,6819),LDOUBLE_HEX(bfbe,c90b,f620,fe60,42b1) /* ~1.26905095719173322259699238090391304467630106955766 T1[108] hi,lo */
/* 44*/ ,LDOUBLE_HEX(3fff,803d,0dc3,2d46,4f85),LDOUBLE_HEX(3fbe,868a,dee3,72d5,ffa8) /* ~1.00186321287269429535036341372133961158397141844034 T2[108] hi,lo */
/* 45*/ ,LDOUBLE_HEX(3fff,a352,0f68,e802,bb93),LDOUBLE_HEX(bfbe,ed0b,a6dd,6268,20c0) /* ~1.27594177839639210043139877504003720787295605987310 T1[109] hi,lo */
/* 45*/ ,LDOUBLE_HEX(3fff,803e,7152,9105,6fd0),LDOUBLE_HEX(3fbb,f7f1,9404,a7bf,1165) /* ~1.00190559894148689158710485713754678727127611637115 T2[109] hi,lo */
/* 46*/ ,LDOUBLE_HEX(3fff,a435,15ae,09e6,809e),LDOUBLE_HEX(3fbb,d1db,4831,781e,1eec) /* ~1.28287001607877828072111492385687370187952183187007 T1[110] hi,lo */
/* 46*/ ,LDOUBLE_HEX(3fff,803f,d4e5,ce9c,5332),LDOUBLE_HEX(3fbc,8ac0,9487,d439,3b90) /* ~1.00194798680351713202930918900079859668039716780185 T2[110] hi,lo */
/* 47*/ ,LDOUBLE_HEX(3fff,a519,5786,be9e,f339),LDOUBLE_HEX(3fbe,d8bc,f46f,9586,461e) /* ~1.28983587340666581218685121656974956749763805419206 T1[111] hi,lo */
/* 47*/ ,LDOUBLE_HEX(3fff,8041,387c,e615,a710),LDOUBLE_HEX(3fbe,8e4c,645a,3a8a,6df3) /* ~1.00199037645886088361557586523531426792033016681671 T2[111] hi,lo */
/* 48*/ ,LDOUBLE_HEX(3fff,a5fe,d6a9,b151,38ea),LDOUBLE_HEX(3fbc,e5eb,fb10,b883,80d9) /* ~1.29683955465100966592158215906493978764046914875507 T1[112] hi,lo */
/* 48*/ ,LDOUBLE_HEX(3fff,8042,9c17,d77c,18ed),LDOUBLE_HEX(3fbe,93f9,0835,f753,878b) /* ~1.00203276790759401653711085922182633112242911010980 T2[112] hi,lo */
/* 49*/ ,LDOUBLE_HEX(3fff,a6e5,94cf,eee8,6b1e),LDOUBLE_HEX(bfbe,c910,e561,f33b,7b4e) /* ~1.30388126519193589861710103061653853728785179555416 T1[113] hi,lo */
/* 49*/ ,LDOUBLE_HEX(3fff,8043,ffb6,a2da,5669),LDOUBLE_HEX(3fbe,9bfa,bd93,3942,b72a) /* ~1.00207516114979240412930644454903017503966111689805 T2[113] hi,lo */
/* 50*/ ,LDOUBLE_HEX(3fff,a7cd,93b4,e965,356a),LDOUBLE_HEX(bfbe,c274,9655,f8c1,1aa2) /* ~1.31096121152476434196416932298490110042621381580829 T1[114] hi,lo */
/* 50*/ ,LDOUBLE_HEX(3fff,8045,6359,483b,0d42),LDOUBLE_HEX(3fbd,8ab1,e480,8fb1,67b1) /* ~1.00211755618553192298016141226213449044735170900821 T2[114] hi,lo */
/* 51*/ ,LDOUBLE_HEX(3fff,a8b6,d516,7b32,0e09),LDOUBLE_HEX(bfbe,d0ad,37b2,7dde,6f19) /* ~1.31807960126606399473437464253677831038658041507005 T1[115] hi,lo */
/* 51*/ ,LDOUBLE_HEX(3fff,8046,c6ff,c7a8,eb53),LDOUBLE_HEX(3fbd,cd04,05c3,2637,6be1) /* ~1.00215995301488845282186085361431082674243953078985 T2[115] hi,lo */
/* 52*/ ,LDOUBLE_HEX(3fff,a9a1,5ab4,ea7c,0ef8),LDOUBLE_HEX(3fbe,a83c,49d8,6a63,f4e6) /* ~1.32523664315974129459391184227001758699771016836166 T1[116] hi,lo */
/* 52*/ ,LDOUBLE_HEX(3fff,8048,2aaa,212e,9e96),LDOUBLE_HEX(bfbe,f210,9561,2774,6f44) /* ~1.00220235163793787674761659456379447874496690928936 T2[116] hi,lo */
/* 53*/ ,LDOUBLE_HEX(3fff,aa8d,2652,ec90,7629),LDOUBLE_HEX(3fbe,ec62,0243,4ca6,7264) /* ~1.33243254708316144930158736459091528558928985148668 T1[117] hi,lo */
/* 53*/ ,LDOUBLE_HEX(3fff,8049,8e58,54d6,d520),LDOUBLE_HEX(bfbd,fa6c,16d0,f9cb,b862) /* ~1.00224475205475608077798632677968271309509873390197 T2[117] hi,lo */
/* 54*/ ,LDOUBLE_HEX(3fff,ab7a,39b5,a93e,d337),LDOUBLE_HEX(3fbe,cb00,4764,eb3c,00f3) /* ~1.33966752405330300531704351696404842186893802136182 T1[118] hi,lo */
/* 54*/ ,LDOUBLE_HEX(3fff,804a,f20a,62ac,3d26),LDOUBLE_HEX(3fbd,8b1b,de3c,962c,ab75) /* ~1.00228715426541895440297469388468698525684885680675 T2[118] hi,lo */
/* 55*/ ,LDOUBLE_HEX(3fff,ac68,96a4,be3f,e929),LDOUBLE_HEX(3fbe,bc2b,7343,bcf2,ec93) /* ~1.34694178623294583574832722350222979912359733134508 T1[119] hi,lo */
/* 55*/ ,LDOUBLE_HEX(3fff,804c,55c0,4ab9,84fb),LDOUBLE_HEX(bfbe,ef50,9f43,e508,28a0) /* ~1.00232955827000239036519285695803205271658953279256 T2[119] hi,lo */
/* 56*/ ,LDOUBLE_HEX(3fff,ad58,3eea,42a1,4ac6),LDOUBLE_HEX(3fbe,9301,5191,eb34,5d89) /* ~1.35425554693689272826688518858162524338695220649242 T1[120] hi,lo */
/* 56*/ ,LDOUBLE_HEX(3fff,804d,b97a,0d09,5b0c),LDOUBLE_HEX(3fbe,d93e,3efa,3df9,fcd1) /* ~1.00237196406858228422617762554125420138007029891014 T2[120] hi,lo */
/* 57*/ ,LDOUBLE_HEX(3fff,ae49,3452,ca35,b80e),LDOUBLE_HEX(3fbd,9637,02d3,0d44,07b1) /* ~1.36160902063822475556963131904097963342792354524135 T1[121] hi,lo */
/* 57*/ ,LDOUBLE_HEX(3fff,804f,1d37,a9a6,6de9),LDOUBLE_HEX(bfbc,c1d5,6430,8a2f,e68c) /* ~1.00241437166123453534217341287515523617912549525499 T2[121] hi,lo */
/* 58*/ ,LDOUBLE_HEX(3fff,af3b,78ad,690a,4375),LDOUBLE_HEX(bfbd,8367,bf8c,d132,bf35) /* ~1.36900242297459061194351420676085240302199963480234 T1[122] hi,lo */
/* 58*/ ,LDOUBLE_HEX(3fff,8050,80f9,209b,6c3b),LDOUBLE_HEX(bfbe,a036,e851,2e22,bdf0) /* ~1.00245678104803504577993006341429804706422146409749 T2[122] hi,lo */
/* 59*/ ,LDOUBLE_HEX(3fff,b02f,0dcb,b6e0,4584),LDOUBLE_HEX(bfbe,90a6,d5b7,91c4,cb15) /* ~1.37643597075453010024695399415861629677237942814826 T1[123] hi,lo */
/* 59*/ ,LDOUBLE_HEX(3fff,8051,e4be,71f3,04ca),LDOUBLE_HEX(3fbc,cada,b8ef,31ad,ee75) /* ~1.00249919222905972096722415631830926940892823040485 T2[123] hi,lo */
/* 60*/ ,LDOUBLE_HEX(3fff,b123,f581,d2ac,2590),LDOUBLE_HEX(bfbe,f05f,902d,25bd,44e3) /* ~1.38390988196383195492356055211757848155684769153594 T1[124] hi,lo */
/* 60*/ ,LDOUBLE_HEX(3fff,8053,4887,9db7,e67d),LDOUBLE_HEX(3fbc,b8f5,8e77,78e8,f943) /* ~1.00254160520438446969285900545187928400991950184106 T2[124] hi,lo */
/* 61*/ ,LDOUBLE_HEX(3fff,b21a,31a6,6618,fe3b),LDOUBLE_HEX(3fbe,f871,4c4e,d9a4,e410) /* ~1.39142437577192618709722576886278488927928265184164 T1[125] hi,lo */
/* 61*/ ,LDOUBLE_HEX(3fff,8054,ac54,a3f4,c057),LDOUBLE_HEX(3fbd,ec30,98f2,c3d2,f4bb) /* ~1.00258401997408520378140400763911088688473682850599 T2[125] hi,lo */
/* 62*/ ,LDOUBLE_HEX(3fff,b311,c412,a911,2489),LDOUBLE_HEX(3fbd,fb3c,5371,e629,4670) /* ~1.39897967253831114018292752776417842142109293490648 T1[126] hi,lo */
/* 62*/ ,LDOUBLE_HEX(3fff,8056,1025,84b4,417a),LDOUBLE_HEX(bfbe,9388,2575,b35d,d384) /* ~1.00262643653823783841845529440917061947402544319629 T2[126] hi,lo */
/* 63*/ ,LDOUBLE_HEX(3fff,b40a,aea2,654b,9841),LDOUBLE_HEX(bfbc,ea37,6118,3363,e500) /* ~1.40657599381901544249601904157387366467446554452180 T1[127] hi,lo */
/* 63*/ ,LDOUBLE_HEX(3fff,8057,73fa,4001,1923),LDOUBLE_HEX(3fbe,b2a6,1fe1,eb6f,b480) /* ~1.00266885489691829171695486300208699503855314105749 T2[127] hi,lo */
/* 64*/ ,LDOUBLE_HEX(3fff,b504,f333,f9de,6484),LDOUBLE_HEX(3fbe,b2fb,1366,ea95,7d3e) /* ~1.41421356237309504876378807303183293697657063603401 T1[128] hi,lo */
/* 64*/ ,LDOUBLE_HEX(3fff,8058,d7d2,d5e5,f6b1),LDOUBLE_HEX(bfbe,d654,ec13,ee23,6abc) /* ~1.00271127505020248547613209710860360246442724019289 T2[128] hi,lo */
};
#define L 7 /* # bits in table index (i1,i2) */
#define K 128 /* table size = 2^L */
#define L_EXPAND (((K/2) << L) + (K/2))
#define L_MASK ((1 << L)-1)
#define constants_80 ((const LC_FLOAT_TYPE *)_constants_80)
# define _DE2IntCst (constants_80[ 0])
# define _K2byLog2 (constants_80[ 1])
# define _Log2byK2Hi (constants_80[ 2])
# define _Log2byK2Med (constants_80[ 3])
# define _p3_HI (constants_80[ 4])
# define _p5 (constants_80[ 5])
# define _p4 (constants_80[ 6])
# define _p3_LO (constants_80[ 7])
# define _Log2byK2Lo (constants_80[ 8])
# define _p6 (constants_80[ 9])
__declspec(align(16)) static const unsigned short _constants_80[] = {
LDOUBLE_HEX(403e,c000,0000,0000,0000) /* 0 DE2IntCst = 1.5*2^63 */
,LDOUBLE_HEX(400d,b8aa,3b29,5c17,f0bc) /* 1 K2byLog2 = K^2/log(2) ~ 23637.11554992 */
,LDOUBLE_HEX(bff0,b172,17f7,d1cf,79ac) /* 2 Log2byK2Hi ~ -4.23063464697232244524347213247665588919943502332898e-05 */
,LDOUBLE_HEX(3fae,d871,319f,f000,0000) /* 3 Log2byK2Med ~ 6.99362349047620977408942987412840832949912800870764e-25 */
,LDOUBLE_HEX(3ffc,aaaa,aaaa,aaaa,aaab) /* 4 p3_HI ~ 1.66666666666666666671184175718689601808364386670291e-01 */
,LDOUBLE_HEX(3ff8,8888,8888,91d5,7943) /* 5 p5 ~ 8.33333333346550207291141649720844775117711833445355e-03 */
,LDOUBLE_HEX(3ffa,aaaa,aaaa,aaaa,aaab) /* 6 p4 ~ 4.16666666666666666677960439296724004520910966675728e-02 */
,LDOUBLE_HEX(bfbb,ab70,78a8,ae65,09cf) /* 7 p3_LO ~ -4.53796157421198095955516441874944572386592208568553e-21 */
,LDOUBLE_HEX(3f84,d095,0bf0,cbcd,98d6) /* 8 Log2byK2Lo ~ 1.53242008494748302860112907643687641670519495734080e-37 */
,LDOUBLE_HEX(3ff5,b60b,60b6,1286,f983) /* 9 p6 ~ 1.38888888890158889343717346078962981970050805102800e-03 */
};
//============================================================================================
double exp_rn( double xd )
{
UINT64 x_val,x_abs,sign_mask,range,x_exp;
SINT64 m,n,i1,i2,xsign,yesno;
X_FLOAT_TYPE xx, rx, r2x, tp0x, tp1x, tpxx, tt1x, tt2x, tptx, resx;
L_FLOAT_TYPE DE2IntCst,K2byLog2,Log2byK2Hi,Log2byK2Med,Log2byK2Lo;
X_FLOAT_TYPE p3;
L_FLOAT_TYPE p2,p4,p5,p6;
L_FLOAT_TYPE tmp,w,mr,tmp1,tmp5,tmp6,tmp7,res,ef,rx2,x4,inf_d,minnorm_d,maxnorm_d;
L_FLOAT_TYPE sc; // Don't know if it wouldn't be better as a double
double resd;
double volatile exception;
/* load constants */
DE2IntCst = _DE2IntCst;
//DE2IntCst = _Asm_setf(_FR_D, 0x43e8000000000000); /* 1 cycle slower */
K2byLog2 = _K2byLog2;
Log2byK2Hi = _Log2byK2Hi;
Log2byK2Med = _Log2byK2Med;
p3.hi = _p3_HI;
p2 = _Asm_setf(_FR_EXP, 0xfffe); /* 0.5 */
p5 = _p5;
p4 = _p4;
p3.lo = _p3_LO;
/* get and classify input value; obtain range value */
/* 40862e42fefa39ef (+) overflow range
* 40874910d52d3051 (-) underflow range
* 000167522bd709be (^)
*/
x_val = _Asm_getf( _FR_D, xd );
sign_mask = ((SINT64)x_val >> 63);
x_exp = _Asm_extr_u( x_val, 52, 11 );
x_abs = (x_val & ULL(7fffffffffffffff));
range = ULL(40862e42fefa39ef) ^ (sign_mask & ULL(000167522bd709be));
/* filter out special cases */
if (__builtin_expect( x_exp < 0x3eb, 0 )) { /* |x| < 2^(-20) */
if (__builtin_expect( x_exp < 0x3c8, 0 )) { /* |x| < 2^(-55) */
return _Asm_fma( _PC_D, xd, 1, 1, _SF0 );
}
/* 2^(-55) <= |x| < 2^(-20) */
// printf("\nToto %1.30e\n", xd);
tmp = p5*xd + p4;
__X_SQR_L( r2x, xd );
tmp = p6*r2x.hi + tmp;
tp1x.hi = p2;
tp1x.lo = tmp*r2x.hi;
__X_FMA_GREATER_LXX( tp0x, xd, p3, tp1x ); /* tp0 = xd * p3 + tp1 */
__X_FMA_GREATER_XXL( tpxx, r2x, tp0x, xd ); /* tpx = r2 * tp0 + xd*/
/* res = (tpxx.lo + tpxx.hi) + 1; */
res = _Asm_fma( _PC_D, tpxx.hi, 1, 1, _SF1 );
tmp = (1 - res);
tmp = (tmp + tpxx.hi);
tmp = (tmp + tpxx.lo);
res = _Asm_fma( _PC_D, res, 1, tmp, _SF0 );
return res;
}
if (__builtin_expect( x_abs > range, 0 )) { /* nan, inf, large finite */
/* NaNs */
if (x_abs > ULL(7ff0000000000000)) {
if (x_abs <= ULL(7ff7ffffffffffff)) {
inf_d = _Asm_setf( _FR_D, ULL(7ff0000000000000) );
exception = _Asm_fma( _PC_D, inf_d, 0, 0, _SF0 );
}
return _Asm_fma( _PC_D, xd, 1, 0, _SF0 );
}
/* INFs */
if (x_abs == ULL(7ff0000000000000)) {
if (sign_mask) /* -inf */
return 0;
else /* +inf */
return xd;
}
/* large finite */
if (sign_mask) { /* underflow */
minnorm_d = _Asm_setf( _FR_D, ULL(0010000000000000) );
return _Asm_fma( _PC_D, minnorm_d, minnorm_d, 0, _SF0 );
} else { /* overflow */
maxnorm_d = _Asm_setf( _FR_D, ULL(7fefffffffffffff) );
return _Asm_fma( _PC_D, maxnorm_d, maxnorm_d, 0, _SF0 );
}
}
/* main path: 2^(-55) <= |x| < range */
/* reduction: x = m*log(2)/(K^2) + r; m = n*K^2 + i1*K + i2; |r|=[0..log(2)/(2*K^2)] */
w = xd * K2byLog2 + DE2IntCst; /* Double2Int on a doubledouble */
mr = (w - DE2IntCst);
m = _Asm_getf( _FR_SIG, w ) + L_EXPAND; /* add L/2 to i1,i2 (make it unsigned table offset) */
rx.hi = mr * Log2byK2Hi + xd;
i1 = (m >> L) & L_MASK;
i2 = m & L_MASK;
// was: n = _Asm_extr( m, 2*L, 16 ); The compiler seems to get it
n = m >> 2*L;
sc = _Asm_setf( _FR_EXP, 0xffff + n ); /* build 2^n */
//sc = _Asm_setf( _FR_D, ULL(3ff0000000000000) + (n<<52) ); /* build 2^n */
/* First step */
/* Compute e^xred as 1+p(xred)
Then compute T*e^xred as T+T*p(xred) */
/* table lookup and reconstruction: T = T1[i1]*T2[i2]*2^n */
/* We read both vlues but it isn't slower */
__X_CONVERT_XC2X( tt1x, TX[i1*2+0] ); /* load T1[i1] */
__X_CONVERT_XC2X( tt2x, TX[i2*2+1] ); /* load T2[i2] */
tptx.hi = tt2x.hi * tt1x.hi ;
/* degree 3 polynomial evaluation: */
rx2=rx.hi*rx.hi;
tmp = p2 + p3.hi*rx.hi;
// We're not adding a correcting term to rx.hi, we're multiplying the final exp by (1+f)
rx.hi = rx.hi + mr * Log2byK2Med;
//ef = 1.0 + mr * Log2byK2Med;
tmp = rx.hi +rx2*tmp; /* tmp = x+x^2/2 + ...*/
/* Final reconstruction and rounding test */
res = tmp*tptx.hi + tptx.hi;
resd = res*sc; /* do the scaling now, saves a few cycles */
#if 0 /* to time the first step alone */
return resd;
#endif
#if 0 // test a la Ziv
/* This test is 3 cycles slower */
L_FLOAT_TYPE reshi,reslo,test,rn_constant;
reshi = _Asm_fma( _PC_D, tmp, tptx.hi, tptx.hi, _SF0 ); /* tmp*tptx.hi + tptx.hi, round to double */
rn_constant = 1.005;
reslo = res - reshi;
test=_Asm_fma( _PC_D, reslo, rn_constant, reshi, _SF0 );
if(__builtin_expect( reshi==test, 1+1==2) ) {
return resd; /* do the scaling now, saves a few cycles */
}
#else // else test a la Ziv
i1 = _Asm_getf( _FR_SIG, res);
m = i1 & (0xff<<3);
if(__builtin_expect((m!=(0x7f<<3) && m!=(0x80<<3)), 1+1==2)) {
return resd;
}
#endif // end test a la Ziv
else {
/***************************************************************************************************/
/**************************************** second step **********************************************/
/***************************************************************************************************/
#if EVAL_PERF
crlibm_second_step_taken++;
#endif
Log2byK2Lo = _Log2byK2Lo;
p6 = _p6;
// Cut from the first step
tmp1 = mr * Log2byK2Med;
tmp7 = mr * Log2byK2Hi + xd;
tmp6 = _Asm_famax( tmp7, tmp1, _SF1 );
tmp5 = _Asm_famin( tmp1, tmp7, _SF1 );
rx.lo = (tmp6 - rx.hi);
rx.lo = (tmp5 + rx.lo);
rx.lo = (mr * Log2byK2Lo + rx.lo);
/* table lookup and reconstruction: T = T1[i1]*T2[i2]*2^n */
__X_MUL_XX( tptx, tt1x, tt2x ); /* T = T1[i1]*T2[i2] */
tptx.hi *= sc; /* scale T' = T*2^n */
tptx.lo *= sc;
/* polynomial evaluation: px = P(r)*r */
tmp = p5*rx.hi + p4;
__X_SQR_X( r2x, rx );
tmp = p6*r2x.hi + tmp;
tp1x.hi = p2;
tp1x.lo = tmp*r2x.hi;
__X_FMA_GREATER_XXX( tp0x, rx, p3, tp1x );
__X_FMA_GREATER_XXX( tpxx, r2x, tp0x, rx );
/* final reconstruction: res = (P(r)*r + 1)*T*2^n */
__X_FMA_GREATER_XXX( resx, tptx, tpxx, tptx );
/* convert and return result */
return (double)( resx.hi + resx.lo );
}
}
/* Just to compile OK within crlibm */
double exp_ru(double x) {
return exp_rn(x);
}
double exp_rd(double x) {
return exp_rn(x);
}
double exp_rz(double x) {
return exp_rn(x);
}