intervals 0.3.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. data/VERSION.txt +1 -0
  2. data/ext/crlibm/AUTHORS +2 -0
  3. data/ext/crlibm/COPYING +504 -0
  4. data/ext/crlibm/ChangeLog +80 -0
  5. data/ext/crlibm/INSTALL +182 -0
  6. data/ext/crlibm/Makefile.am +84 -0
  7. data/ext/crlibm/Makefile.in +530 -0
  8. data/ext/crlibm/NEWS +0 -0
  9. data/ext/crlibm/README +31 -0
  10. data/ext/crlibm/TODO +47 -0
  11. data/ext/crlibm/VERSION +1 -0
  12. data/ext/crlibm/aclocal.m4 +989 -0
  13. data/ext/crlibm/atan-itanium.c +846 -0
  14. data/ext/crlibm/atan-pentium.c +261 -0
  15. data/ext/crlibm/atan_accurate.c +244 -0
  16. data/ext/crlibm/atan_accurate.h +191 -0
  17. data/ext/crlibm/atan_fast.c +324 -0
  18. data/ext/crlibm/atan_fast.h +678 -0
  19. data/ext/crlibm/config.guess +1461 -0
  20. data/ext/crlibm/config.sub +1566 -0
  21. data/ext/crlibm/configure +7517 -0
  22. data/ext/crlibm/configure.ac +364 -0
  23. data/ext/crlibm/crlibm.h +125 -0
  24. data/ext/crlibm/crlibm_config.h +149 -0
  25. data/ext/crlibm/crlibm_config.h.in +148 -0
  26. data/ext/crlibm/crlibm_private.c +293 -0
  27. data/ext/crlibm/crlibm_private.h +658 -0
  28. data/ext/crlibm/csh_fast.c +631 -0
  29. data/ext/crlibm/csh_fast.h +771 -0
  30. data/ext/crlibm/double-extended.h +496 -0
  31. data/ext/crlibm/exp-td.c +962 -0
  32. data/ext/crlibm/exp-td.h +685 -0
  33. data/ext/crlibm/exp_accurate.c +197 -0
  34. data/ext/crlibm/exp_accurate.h +85 -0
  35. data/ext/crlibm/gappa/log-de-E0-logir0.gappa +106 -0
  36. data/ext/crlibm/gappa/log-de-E0.gappa +79 -0
  37. data/ext/crlibm/gappa/log-de.gappa +81 -0
  38. data/ext/crlibm/gappa/log-td-E0-logir0.gappa +126 -0
  39. data/ext/crlibm/gappa/log-td-E0.gappa +143 -0
  40. data/ext/crlibm/gappa/log-td-accurate-E0-logir0.gappa +230 -0
  41. data/ext/crlibm/gappa/log-td-accurate-E0.gappa +213 -0
  42. data/ext/crlibm/gappa/log-td-accurate.gappa +217 -0
  43. data/ext/crlibm/gappa/log-td.gappa +156 -0
  44. data/ext/crlibm/gappa/trigoSinCosCase3.gappa +204 -0
  45. data/ext/crlibm/gappa/trigoTanCase2.gappa +73 -0
  46. data/ext/crlibm/install-sh +269 -0
  47. data/ext/crlibm/log-de.c +431 -0
  48. data/ext/crlibm/log-de.h +732 -0
  49. data/ext/crlibm/log-td.c +852 -0
  50. data/ext/crlibm/log-td.h +819 -0
  51. data/ext/crlibm/log10-td.c +906 -0
  52. data/ext/crlibm/log10-td.h +823 -0
  53. data/ext/crlibm/log2-td.c +935 -0
  54. data/ext/crlibm/log2-td.h +821 -0
  55. data/ext/crlibm/maple/atan.mpl +359 -0
  56. data/ext/crlibm/maple/common-procedures.mpl +997 -0
  57. data/ext/crlibm/maple/csh.mpl +446 -0
  58. data/ext/crlibm/maple/double-extended.mpl +151 -0
  59. data/ext/crlibm/maple/exp-td.mpl +195 -0
  60. data/ext/crlibm/maple/log-de.mpl +243 -0
  61. data/ext/crlibm/maple/log-td.mpl +316 -0
  62. data/ext/crlibm/maple/log10-td.mpl +345 -0
  63. data/ext/crlibm/maple/log2-td.mpl +334 -0
  64. data/ext/crlibm/maple/trigo.mpl +728 -0
  65. data/ext/crlibm/maple/triple-double.mpl +58 -0
  66. data/ext/crlibm/missing +198 -0
  67. data/ext/crlibm/mkinstalldirs +40 -0
  68. data/ext/crlibm/rem_pio2_accurate.c +219 -0
  69. data/ext/crlibm/rem_pio2_accurate.h +53 -0
  70. data/ext/crlibm/scs_lib/AUTHORS +3 -0
  71. data/ext/crlibm/scs_lib/COPYING +504 -0
  72. data/ext/crlibm/scs_lib/ChangeLog +16 -0
  73. data/ext/crlibm/scs_lib/INSTALL +215 -0
  74. data/ext/crlibm/scs_lib/Makefile.am +18 -0
  75. data/ext/crlibm/scs_lib/Makefile.in +328 -0
  76. data/ext/crlibm/scs_lib/NEWS +0 -0
  77. data/ext/crlibm/scs_lib/README +9 -0
  78. data/ext/crlibm/scs_lib/TODO +4 -0
  79. data/ext/crlibm/scs_lib/addition_scs.c +623 -0
  80. data/ext/crlibm/scs_lib/config.guess +1461 -0
  81. data/ext/crlibm/scs_lib/config.sub +1566 -0
  82. data/ext/crlibm/scs_lib/configure +6226 -0
  83. data/ext/crlibm/scs_lib/division_scs.c +110 -0
  84. data/ext/crlibm/scs_lib/double2scs.c +174 -0
  85. data/ext/crlibm/scs_lib/install-sh +269 -0
  86. data/ext/crlibm/scs_lib/missing +198 -0
  87. data/ext/crlibm/scs_lib/mkinstalldirs +40 -0
  88. data/ext/crlibm/scs_lib/multiplication_scs.c +456 -0
  89. data/ext/crlibm/scs_lib/poly_fct.c +112 -0
  90. data/ext/crlibm/scs_lib/print_scs.c +73 -0
  91. data/ext/crlibm/scs_lib/rand_scs.c +63 -0
  92. data/ext/crlibm/scs_lib/scs.h +353 -0
  93. data/ext/crlibm/scs_lib/scs2double.c +391 -0
  94. data/ext/crlibm/scs_lib/scs2mpf.c +58 -0
  95. data/ext/crlibm/scs_lib/scs2mpfr.c +61 -0
  96. data/ext/crlibm/scs_lib/scs_private.c +23 -0
  97. data/ext/crlibm/scs_lib/scs_private.h +133 -0
  98. data/ext/crlibm/scs_lib/tests/tbx_timing.h +102 -0
  99. data/ext/crlibm/scs_lib/wrapper_scs.h +486 -0
  100. data/ext/crlibm/scs_lib/zero_scs.c +52 -0
  101. data/ext/crlibm/stamp-h.in +1 -0
  102. data/ext/crlibm/tests/Makefile.am +43 -0
  103. data/ext/crlibm/tests/Makefile.in +396 -0
  104. data/ext/crlibm/tests/blind_test.c +148 -0
  105. data/ext/crlibm/tests/generate_test_vectors.c +258 -0
  106. data/ext/crlibm/tests/soak_test.c +334 -0
  107. data/ext/crlibm/tests/test_common.c +627 -0
  108. data/ext/crlibm/tests/test_common.h +28 -0
  109. data/ext/crlibm/tests/test_perf.c +570 -0
  110. data/ext/crlibm/tests/test_val.c +249 -0
  111. data/ext/crlibm/trigo_accurate.c +500 -0
  112. data/ext/crlibm/trigo_accurate.h +331 -0
  113. data/ext/crlibm/trigo_fast.c +1219 -0
  114. data/ext/crlibm/trigo_fast.h +639 -0
  115. data/ext/crlibm/triple-double.h +878 -0
  116. data/ext/extconf.rb +31 -0
  117. data/ext/fpu.c +107 -0
  118. data/ext/jamis-mod.rb +591 -0
  119. data/lib/fpu.rb +287 -0
  120. data/lib/interval.rb +1170 -0
  121. data/lib/intervals.rb +212 -0
  122. data/lib/struct_float.rb +133 -0
  123. data/test/data_atan.txt +360 -0
  124. data/test/data_cos.txt +346 -0
  125. data/test/data_cosh.txt +3322 -0
  126. data/test/data_exp.txt +3322 -0
  127. data/test/data_log.txt +141 -0
  128. data/test/data_sin.txt +140 -0
  129. data/test/data_sinh.txt +3322 -0
  130. data/test/data_tan.txt +342 -0
  131. metadata +186 -0
@@ -0,0 +1,195 @@
1
+ #######################################################################
2
+ # This file is part of the crlibm library, and is distributed under
3
+ # the LGPL.
4
+ # To use:
5
+ # restart; read "exp-td.mpl";
6
+ Digits := 120:
7
+
8
+ interface(quiet=true):
9
+
10
+ read "common-procedures.mpl":
11
+ read "triple-double.mpl":
12
+ mkdir("TEMPEXP"):
13
+
14
+ L := 12:
15
+
16
+ printf(" memory requirement for L = %d and two triple-double tables: %d bytes\n",L,48*2^(ceil(L/2)));
17
+
18
+ rmax := log(2) / (2^(L+1)):
19
+
20
+ printf(" maximal absolute value for rmax = 2^(%f)\n",log[2](rmax)):
21
+
22
+
23
+ MsLog2Div2L := evalf(-log(2)/(2^L)):
24
+
25
+ msLog2Div2Lh, msLog2Div2Lm, msLog2Div2Ll := hi_mi_lo(MsLog2Div2L):
26
+
27
+ epsMsLog2Div2L := evalf(((msLog2Div2Lh + msLog2Div2Lm + msLog2Div2Ll) - MsLog2Div2L)/MsLog2Div2L):
28
+
29
+ printf(" error made by storing MsLog2Div2L as a triple-double: 2^(%f)\n",log[2](epsMsLog2Div2L)):
30
+
31
+
32
+ log2InvMult2L := nearest(2^L / (log(2))):
33
+
34
+ shiftConst := 2^(52) + 2^(51):
35
+
36
+ indexmask1 := 2^(L/2) - 1:
37
+ indexmask2 := indexmask1 * 2^(L/2):
38
+
39
+ largest := 2^(1023) * ((2^(53) - 1) / 2^(52)):
40
+ smallest := 2^(-1023) * 1 * 2^(-51):
41
+
42
+ overflowbound := nearest(log(largest)):
43
+
44
+ overflowboundHex := ieeehexa(overflowbound):
45
+ overflowSimplebound := convert(overflowboundHex[1],decimal,hex):
46
+
47
+ underflowbound := nearest(log(2^(-1075))):
48
+
49
+ denormbound := nearest(log(2^(-1022) * 1)):
50
+
51
+
52
+ overUnderflowboundHex := ieeehexa(min(abs(underflowbound),min(abs(overflowbound),abs(denormbound)))):
53
+ overUnderflowSimplebound := convert(overUnderflowboundHex[1],decimal,hex):
54
+
55
+ twoPowerM1000 := 2^(-1000):
56
+ twoPower1000 := 2^(1000):
57
+
58
+ twoM52 := 2^(-52):
59
+ mTwoM53 := - 2^(-53):
60
+
61
+ for i from 0 to 2^(L/2) - 1 do
62
+ twoPowerIndex1hi[i], twoPowerIndex1mi[i], twoPowerIndex1lo[i] := hi_mi_lo(evalf(2^(i/(2^L)))):
63
+ twoPowerIndex2hi[i], twoPowerIndex2mi[i], twoPowerIndex2lo[i] := hi_mi_lo(evalf(2^(i/(2^(L/2))))):
64
+ od:
65
+
66
+
67
+
68
+ PolyDegreeQuick:=4:
69
+ printf(" degree of the polynomial used in the quick phase is %d\n",PolyDegreeQuick);
70
+
71
+
72
+
73
+ polyQuick:= poly_exact(1 + x + 0.5*x^2 + x^3 * (numapprox[minimax](((exp(x) - (1 + x + 0.5*x^2))/x^3),
74
+ x=-rmax..rmax, [PolyDegreeQuick-3,0], 1 , 'deltaApprox'))):
75
+
76
+ epsilonApproxQuick := numapprox[infnorm]( (polyQuick/exp(x))-1, x=-rmax..rmax):
77
+ printf(" approximation rel error for the quick phase is 2^(%2f)\n", log2(epsilonApproxQuick) ) :
78
+ deltaApproxQuick := numapprox[infnorm]( polyQuick-exp(x), x=-rmax..rmax):
79
+ printf(" approximation abs error for the quick phase is 2^(%2f)\n", log2(deltaApproxQuick) ) :
80
+
81
+
82
+
83
+ PolyDegreeAccurate:=7:
84
+
85
+ printf(" degree of the polynomial used in the accurate phase is %d\n",PolyDegreeAccurate):
86
+
87
+ DDNumberAccu:=5:
88
+
89
+
90
+ printf(" number of double doubles used for the coefficients is %d\n",DDNumberAccu):
91
+
92
+
93
+
94
+ polyAccurate:= poly_exact2(1 + x + 0.5*x^2 + x^3 * (numapprox[minimax](((exp(x) - (1 + x + 0.5*x^2))/x^3),
95
+ x=-rmax..rmax, [PolyDegreeAccurate-3,0], 1 , 'deltaApprox')),
96
+ DDNumberAccu):
97
+
98
+
99
+ epsilonApproxAccurate := numapprox[infnorm]( (polyAccurate/exp(x))-1, x=-rmax..rmax):
100
+ printf(" approximation rel error for the accurate phase is 2^(%2f)\n", log2(epsilonApproxAccurate) ) :
101
+ deltaApproxAccurate := numapprox[infnorm]( polyAccurate-exp(x), x=-rmax..rmax):
102
+ printf(" approximation abs error for the quick phase is 2^(%2f)\n", log2(deltaApproxAccurate) ) :
103
+
104
+
105
+ epsilon_quick := 2^(-64): # The Gappa proof will show this bound
106
+
107
+
108
+
109
+
110
+
111
+ #-------------------------------------------------------------------
112
+ # Output
113
+
114
+ filename:="TEMPEXP/exp-td.h":
115
+ fd:=fopen(filename, WRITE, TEXT):
116
+
117
+ fprintf(fd, "#include \"crlibm.h\"\n#include \"crlibm_private.h\"\n"):
118
+
119
+ fprintf(fd, "\n/*File generated by maple/exp-td.mpl*/\n"):
120
+
121
+ fprintf(fd, "\#define L %d\n",L):
122
+ fprintf(fd, "\#define LHALF %d\n",L/2):
123
+ fprintf(fd, "\#define log2InvMult2L %1.50e\n",log2InvMult2L):
124
+ fprintf(fd, "\#define msLog2Div2Lh %1.50e\n",msLog2Div2Lh):
125
+ fprintf(fd, "\#define msLog2Div2Lm %1.50e\n",msLog2Div2Lm):
126
+ fprintf(fd, "\#define msLog2Div2Ll %1.50e\n",msLog2Div2Ll):
127
+ fprintf(fd, "\#define shiftConst %1.50e\n",shiftConst):
128
+ fprintf(fd, "\#define INDEXMASK1 0x%08x\n",indexmask1):
129
+ fprintf(fd, "\#define INDEXMASK2 0x%08x\n",indexmask2):
130
+ fprintf(fd, "\#define OVRUDRFLWSMPLBOUND 0x%08x\n",overUnderflowSimplebound):
131
+ fprintf(fd, "\#define OVRFLWBOUND %1.50e\n",overflowbound):
132
+ fprintf(fd, "\#define LARGEST %1.50e\n",largest):
133
+ fprintf(fd, "\#define SMALLEST %1.50e\n",smallest):
134
+ fprintf(fd, "\#define DENORMBOUND %1.50e\n",denormbound):
135
+ fprintf(fd, "\#define UNDERFLWBOUND %1.50e\n",underflowbound):
136
+ fprintf(fd, "\#define twoPowerM1000 %1.50e\n",twoPowerM1000):
137
+ fprintf(fd, "\#define twoPower1000 %1.50e\n",twoPower1000):
138
+ fprintf(fd, "\#define ROUNDCST %1.50e\n", compute_rn_constant(epsilon_quick)):
139
+ fprintf(fd, "\#define RDROUNDCST %1.50e\n", epsilon_quick):
140
+ fprintf(fd, "\#define twoM52 %1.50e\n", twoM52):
141
+ fprintf(fd, "\#define mTwoM53 %1.50e\n", mTwoM53):
142
+
143
+ fprintf(fd,"\n\n"):
144
+
145
+ for i from 3 to PolyDegreeQuick do
146
+ fprintf(fd, "\#define c%d %1.50e\n",i,coeff(polyQuick,x,i)):
147
+ od:
148
+
149
+
150
+ for i from 3 to DDNumberAccu-1 do
151
+ (hi,lo) := hi_lo(coeff(polyAccurate,x,i)):
152
+ fprintf(fd, "\#define accPolyC%dh %1.50e\n",i,hi):
153
+ fprintf(fd, "\#define accPolyC%dl %1.50e\n",i,lo):
154
+ od:
155
+
156
+ for i from DDNumberAccu to PolyDegreeAccurate do
157
+ fprintf(fd, "\#define accPolyC%d %1.50e\n",i,coeff(polyAccurate,x,i)):
158
+ od:
159
+
160
+ fprintf(fd,"\n\n"):
161
+
162
+ # Print the tables
163
+ fprintf(fd, "typedef struct tPi_t_tag {double hi; double mi; double lo;} tPi_t; \n"):
164
+ fprintf(fd, "static const tPi_t twoPowerIndex1[%d] = {\n", 2^(L/2)):
165
+ for i from 0 to 2^(L/2)-1 do
166
+ fprintf(fd, " { \n"):
167
+ fprintf(fd, " %1.50e, /* twoPowerIndex1hi[%d] */ \n", twoPowerIndex1hi[i], i):
168
+ fprintf(fd, " %1.50e, /* twoPowerIndex1mi[%d] */ \n", twoPowerIndex1mi[i], i):
169
+ fprintf(fd, " %1.50e, /* twoPowerIndex1lo[%d] */ \n", twoPowerIndex1lo[i], i):
170
+ fprintf(fd, " } "):
171
+ if(i<2^(L/2)-1) then fprintf(fd, ", \n"): fi
172
+ od:
173
+ fprintf(fd, "}; \n \n"):
174
+ fprintf(fd, "static const tPi_t twoPowerIndex2[%d] = {\n", 2^(L/2)):
175
+ for i from 0 to 2^(L/2)-1 do
176
+ fprintf(fd, " { \n"):
177
+ fprintf(fd, " %1.50e, /* twoPowerIndex2hi[%d] */ \n", twoPowerIndex2hi[i], i):
178
+ fprintf(fd, " %1.50e, /* twoPowerIndex2mi[%d] */ \n", twoPowerIndex2mi[i], i):
179
+ fprintf(fd, " %1.50e, /* twoPowerIndex2lo[%d] */ \n", twoPowerIndex2lo[i], i):
180
+ fprintf(fd, " } "):
181
+ if(i<2^(L/2)-1) then fprintf(fd, ", \n"): fi
182
+ od:
183
+ fprintf(fd, "}; \n \n"):
184
+
185
+
186
+
187
+
188
+ fprintf(fd, "\n\n"):
189
+
190
+
191
+
192
+
193
+ printf("----DONE---\n") :
194
+
195
+
@@ -0,0 +1,243 @@
1
+ #######################################################################
2
+ # This file is part of the crlibm library, and is distributed under
3
+ # the LGPL.
4
+ # To use:
5
+ # restart; read "log-de.mpl";
6
+ Digits := 100:
7
+
8
+ interface(quiet=true):
9
+
10
+ read "common-procedures.mpl":
11
+ read "double-extended.mpl":
12
+ mkdir("TEMPLOG"):
13
+
14
+
15
+ log2h,log2l := hiloExt(log(2)):
16
+
17
+
18
+ L := 7: # number of bits used to address the table
19
+
20
+ MAXINDEX := round(2^L * (sqrt(2)-1)):
21
+
22
+ for i from 0 to MAXINDEX-1 do
23
+ center[i] := 1 + i*2^(-L): # center[i] in [1, 2[
24
+ # We want it to fit on 11 bits of mantissa
25
+ r[i] := round(evalf( (1/center[i]) * 2^(11)) ) / 2^(11) ;
26
+
27
+ od:
28
+ for i from MAXINDEX to 2^L do
29
+ # y has been divided by two, center[i] in [0.5, 1[
30
+ center[i]:=(1 + i*2^(-L)) / 2:
31
+ # We want it to fit on 11 bits of mantissa,
32
+ r[i] := round(evalf( (1/center[i]) * 2^(10)) ) / 2^(10) ;
33
+ od:
34
+
35
+ # Note that we go up to 2^L although the case 2^L is wrapped to zero
36
+ # in the C code. It could be important for zmax (but it turns out not).
37
+
38
+ for i from 0 to 2^L do
39
+ (logirh[i], logirl[i]) := hiloExt(-log(r[i])):
40
+ od:
41
+
42
+ #Computation of ZMax.
43
+ for i from 0 to MAXINDEX-1 do
44
+ _x := center[i] + 2^(-L-1) :
45
+ zmax[i] := (_x*r[i]-1) :
46
+ _x := center[i] - 2^(-L-1) :
47
+ zmin[i] := (_x*r[i]-1) :
48
+ od:
49
+ for i from MAXINDEX to 2^L do
50
+ _x := center[i] + 2^(-L-2) :
51
+ zmax[i] := (_x*r[i]-1) :
52
+ _x := center[i] - 2^(-L-2) :
53
+ zmin[i] := (_x*r[i]-1) :
54
+ od:
55
+
56
+ zmaxmax:=0:
57
+ zminmin:=0:
58
+ for i from 0 to 2^L do
59
+ if zmax[i] > zmaxmax then zmaxmax := zmax[i]: fi:
60
+ if zmin[i] < zminmin then zminmin := zmin[i]: fi:
61
+ od:
62
+ printf("zminmin = -2^(%2f) zmaxmax = 2^(%2f)\n", log2(-zminmin), log2(zmaxmax) ) :
63
+
64
+
65
+ PolyDegreeQuick:=7:
66
+
67
+ #Keep -zmaxmax..zmaxmax to keep c1=1, which is useful in the proof
68
+ polyQuick:= polyExact2Ext(x * numapprox[minimax]( log(1+x)/x, x=-zmaxmax..zmaxmax, [PolyDegreeQuick-1,0], 1 , 'deltaApprox'), 0):
69
+
70
+ epsilonApproxQuick := numapprox[infnorm]( 1-polyQuick/log(1+x), x=zminmin..zmaxmax):
71
+ printf(" approximation rel error for the quick phase is 2^(%2f)\n", log2(epsilonApproxQuick) ) :
72
+ deltaApproxQuick := numapprox[infnorm]( polyQuick-log(1+x), x=zminmin..zmaxmax):
73
+ printf(" approximation abs error for the quick phase is 2^(%2f)\n", log2(deltaApproxQuick) ) :
74
+
75
+
76
+
77
+ PolyDegreeAccurate:=14:
78
+
79
+ printf("Computing the polynomial for accurate phase (this may take some time...)\n"):
80
+ pe:= x * numapprox[minimax]( log(1+x)/x, x=-zmaxmax..zmaxmax, [PolyDegreeAccurate-1,0], 1 , 'deltaApprox'):
81
+
82
+
83
+ MaxDegreeDDE:=8: #
84
+
85
+ polyAccurate := polyExact2Ext(pe, MaxDegreeDDE):
86
+ #deltaApprox := numapprox[infnorm](polyAccurate-log(1+x), x=-zmaxmax..zmaxmax):
87
+ epsilonApproxAccurate := numapprox[infnorm]( 1-polyAccurate/log(1+x), x=-zmaxmax..zmaxmax):
88
+ printf(" approximation error for the accurate phase is 2^(%2f)\n", log2(epsilonApproxAccurate) ) :
89
+
90
+
91
+
92
+
93
+ filename:="TEMPLOG/log-de.h":
94
+ fd:=fopen(filename, WRITE, TEXT):
95
+
96
+ fprintf(fd, "/*File generated by maple/log-de.mpl*/\n\n"):
97
+
98
+ fprintf(fd, "#if defined(CRLIBM_TYPECPU_X86) || defined(CRLIBM_TYPECPU_AMD64)\n\n"):
99
+ fprintf(fd, " /* Coefficients are read directly from the array thanks to the following macros */ \n"):
100
+ for i from PolyDegreeQuick to 1 by -1 do
101
+ fprintf(fd, "#define c%d c[%d]\n", i, PolyDegreeQuick-i):
102
+ od:
103
+ for i from PolyDegreeAccurate to 1 by -1 do
104
+ fprintf(fd, "#define c%dh ch[%d]\n", i, PolyDegreeAccurate-i):
105
+ od:
106
+
107
+ for i from MaxDegreeDDE-1 to 1 by -1 do
108
+ fprintf(fd, "#define c%dl cl[%d]\n", i, MaxDegreeDDE-1-i):
109
+ od:
110
+ fprintf(fd, "#define PREFETCH_POLY_ACCURATE \n"):
111
+ fprintf(fd, "\n#else /* not(defined(CRLIBM_TYPECPU_X86) || defined(CRLIBM_TYPECPU_AMD64)),\n assuming Itanium, otherwise we shouldn't be there */ \n\n"):
112
+ fprintf(fd, "#define PREFETCH_POLY_QUICK "):
113
+ for i from PolyDegreeQuick to 1 by -1 do
114
+ fprintf(fd, "c%d=c[%d]; ", i, PolyDegreeQuick-i):
115
+ od:
116
+ fprintf(fd, "\n#define PREFETCH_POLY_ACCURATE "):
117
+ for i from PolyDegreeAccurate to 1 by -1 do
118
+ fprintf(fd, "c%dh=ch[%d]; ", i, PolyDegreeAccurate-i):
119
+ if i mod 4 =0 then fprintf(fd, "\\\n "): fi:
120
+ od:
121
+ fprintf(fd, "\\\n "):
122
+ for i from MaxDegreeDDE-1 to 1 by -1 do
123
+ fprintf(fd, "c%dl=cl[%d]; ", i, MaxDegreeDDE-1-i):
124
+ od:
125
+
126
+ fprintf(fd, "\n#endif /* defined(CRLIBM_TYPECPU_X86) || defined(CRLIBM_TYPECPU_AMD64) */ \n\n"):
127
+
128
+ # Various constants
129
+ fprintf(fd, "#define L %d\n", L):
130
+ fprintf(fd, "#define MAXINDEX %d\n", MAXINDEX):
131
+ fprintf(fd, "#define INDEXMASK %d\n", 2^L-1):
132
+ fprintf(fd, "static const long double log2h = %1.50eL ;\n", log2h):
133
+ fprintf(fd, "static const long double log2l = %1.50eL ;\n", log2l):
134
+ fprintf(fd, "static const long double two64 = %1.50eL ;\n", evalf(2^64)):
135
+
136
+ # The polynomials
137
+ # polynomial for quick phase
138
+ # for i from PolyDegreeQuick to 1 by -1 do
139
+ # fprintf(fd, "static const long double c%d = %1.50eL ;\n", i, coeff(polyQuick,x,i)):
140
+ # od:
141
+ fprintf(fd, "static const long double c[%d] = {\n",PolyDegreeQuick):
142
+ for i from PolyDegreeQuick to 1 by -1 do
143
+ fprintf(fd, " /* c%d = */ %1.50eL, \n", i, coeff(polyQuick,x,i)):
144
+ od:
145
+ fprintf(fd, "}; \n \n"):
146
+
147
+ # polynomial for accurate phase
148
+ # polynomial for accurate phase
149
+ fprintf(fd, "static const long double ch[%d] = {\n",PolyDegreeAccurate):
150
+ for i from PolyDegreeAccurate to 1 by -1 do
151
+ (ch, cl) := hiloExt(coeff(polyAccurate,x,i)):
152
+ fprintf(fd, " /* ch%d = */ %1.50eL, \n", i, ch):
153
+ od:
154
+ fprintf(fd, "}; \n \n"):
155
+
156
+ fprintf(fd, "static const long double cl[%d] = {\n", MaxDegreeDDE):
157
+ for i from MaxDegreeDDE-1 to 1 by -1 do
158
+ (ch, cl) := hiloExt(coeff(polyAccurate,x,i)):
159
+ fprintf(fd, " /* cl%d = */ %1.50eL, \n", i, cl):
160
+ od:
161
+ fprintf(fd, "}; \n \n"):
162
+
163
+
164
+ # The tables
165
+
166
+
167
+ fprintf(fd, "typedef struct rri_tag {float r; long double logirh; long double logirl; } rri ; \n"):
168
+ fprintf(fd, "static const rri argredtable[%d] = {\n", 2^L):
169
+ for i from 0 to 2^L-1 do
170
+ fprintf(fd, " { \n"):
171
+ fprintf(fd, " %1.50eL, /* r[%d] */ \n", r[i], i):
172
+ fprintf(fd, " %1.50eL, /* logirh[%d] */ \n", logirh[i], i):
173
+ fprintf(fd, " %1.50eL, /* logirl[%d] */ \n", logirl[i], i):
174
+ fprintf(fd, " } "):
175
+ if(i<2^L-1) then fprintf(fd, ", \n"): fi
176
+ od:
177
+ fprintf(fd, "}; \n \n"):
178
+
179
+ fclose(fd):
180
+
181
+ printf("\n\n************ DONE TEMPLOG/log-de.h ************\n");
182
+
183
+
184
+
185
+
186
+
187
+
188
+ for j from 0 to 2^L-1 do
189
+ filename:=cat("TEMPLOG/log-de_",j,".sed"):
190
+ fd:=fopen(filename, WRITE, TEXT):
191
+ fprintf(fd, " s/_log2h/%1.40e/g\n", log2h):
192
+ fprintf(fd, " s/_log2l/%1.40e/g\n", log2l):
193
+ fprintf(fd, " s/_r/%1.40e/g\n", r[j]):
194
+ fprintf(fd, " s/_logirh/%1.40e/g\n", logirh[j]):
195
+ fprintf(fd, " s/_logirl/%1.40e/g\n", logirl[j]):
196
+ fprintf(fd, " s/_zmin/%1.40e/g\n", zmin[j]):
197
+ fprintf(fd, " s/_zmax/%1.40e/g\n", zmax[j]):
198
+ for i from PolyDegreeQuick to 1 by -1 do
199
+ fprintf(fd, " s/_c%d/%1.40e/g\n", i, coeff(polyQuick,x,i)):
200
+ od:
201
+ fprintf(fd, " s/_deltaApproxQuick/%1.40e/g\n", deltaApproxQuick):
202
+ fprintf(fd, " s/_epsilonApproxQuick/%1.40e/g\n", epsilonApproxQuick):
203
+ fclose(fd):
204
+ od:
205
+
206
+
207
+
208
+ printf("\n\n************ DONE TEMPLOG/log-de*.sed ************\n");
209
+
210
+ # A shell script to use them
211
+ filename:="TEMPLOG/run-log-de-proof.sh":
212
+ fd:=fopen(filename, WRITE, TEXT):
213
+ fprintf(fd, "#!/bin/sh\n"):
214
+ fprintf(fd, "# You probably need to edit the path to the gappa executable\n"):
215
+ fprintf(fd, "GAPPA=~/gappa/src/gappa\n"):
216
+ fprintf(fd, "# Test all the possible table value for E=1\n"):
217
+ fprintf(fd, "for num in `seq 0 %d`; do\n", 2^L-1):
218
+ fprintf(fd, " echo $num, E=1:\n"):
219
+ fprintf(fd, " sed -f TEMPLOG/log-de_$num.sed log-de.gappa | $GAPPA > /dev/null\n"):
220
+ fprintf(fd, " echo\n"):
221
+ fprintf(fd, "done\n"):
222
+ fprintf(fd, "# For the case E=0 we first handle the cases 0 and %d using log-de-E0-logir0.gappa\n", 2^L):
223
+ fprintf(fd, "echo 0 and %d, E=0:\n", 2^L):
224
+ fprintf(fd, "sed -f TEMPLOG/log-de_0.sed log-de-E0-logir0.gappa | $GAPPA > /dev/null\n"):
225
+ fprintf(fd, "# then the other cases where logirh <> 0\n"):
226
+ fprintf(fd, "for num in `seq 1 %d`; do\n", 2^L-1):
227
+ fprintf(fd, " echo $num, E=0:\n"):
228
+ fprintf(fd, " sed -f TEMPLOG/log-de_$num.sed log-de-E0.gappa | $GAPPA > /dev/null\n"):
229
+ fprintf(fd, " echo\n"):
230
+ fprintf(fd, "done\n"):
231
+ fclose(fd):
232
+
233
+ printf("************ DONE TEMPLOG/run-log-de-proof.sh ************\n"):
234
+ printf("Now you should run\n"):
235
+ printf(" sh TEMPLOG/run-log-de-proof.sh 2>TEMPLOG/Gappa.out\n"):
236
+ printf(" (You probably need to edit the path to the gappa executable within TEMPLOG/run-log-de-proof.sh)\n"):
237
+ printf("Then look at TEMPLOG/Gappa.out. It shouldn't contain 'no proof'.\nThis means that everything is OK.\n\n"):
238
+
239
+
240
+
241
+
242
+ printf("----DONE---\n") :
243
+