00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <l_rmath.hpp>
00027 #include <rmath.hpp>
00028 #include <l_interval.hpp>
00029
00030 namespace cxsc {
00031
00032 l_real sqrt(const l_real &x) throw(ERROR_LREAL_STD_FKT_OUT_OF_DEF)
00033
00034 {
00035 int stagsave = stagprec, stagmax = 19, stagcalc;
00036 l_real y;
00037 if (sign(x[1])<0)
00038 cxscthrow(ERROR_LREAL_STD_FKT_OUT_OF_DEF("l_real sqrt(const l_real &x)"));
00039 else if (zero_(x) || x == 1.0 )
00040 y = x;
00041 else
00042 {
00043 l_real x1 = x;
00044 int ex = expo(x1[1]);
00045 ex = 1021-ex;
00046 if (ex%2) ex--;
00047 times2pown(x1,ex);
00048
00049
00050 if (stagprec < stagmax) stagcalc = stagprec+1;
00051 else stagcalc = stagmax+1;
00052 y = sqrt(_real(x1));
00053 stagprec = 1;
00054 while (stagprec < stagcalc)
00055 {
00056 stagprec += stagprec;
00057 if (stagprec > stagcalc) stagprec = stagcalc;
00058
00059 y += x1/y;
00060 times2pown(y,-1);
00061 }
00062 times2pown(y,-ex/2);
00063 stagprec = stagsave;
00064 adjust(y);
00065 }
00066 return y;
00067 }
00068
00069 l_real sqrtx2y2(const l_real& x,
00070 const l_real& y) throw()
00071
00072
00073
00074
00075
00076 {
00077 int stagsave = stagprec, stagcalc, stagmax = 19;
00078 l_real a,b,r,r1;
00079 int exa,exb,ex;
00080 a = x; b = y;
00081 exa = expo(a[1]);
00082 exb = expo(b[1]);
00083 if (exb > exa)
00084 {
00085 r = a; a = b; b = r;
00086 ex = exa; exa = exb; exb = ex;
00087 }
00088 if (sign(a[1]) < 0) a = -a;
00089 if (sign(b[1]==0)) return a;
00090
00091
00092 ex = 0;
00093 if (6*exb < 5*exa-1071)
00094 {
00095
00096
00097 r1 = (b/a);
00098 r = r1*r1;
00099 times2pown(r,-2);
00100 r = 1 - r;
00101 r1 *= b;
00102 times2pown(r1,-1);
00103 r *= r1;
00104 r += a;
00105 } else
00106 {
00107
00108 stagcalc = stagprec;
00109 if (stagcalc > stagmax) stagcalc = stagmax;
00110 stagprec = stagcalc;
00111
00112 ex = 511 - exa;
00113 if (ex < 0)
00114 {
00115 r = b/a;
00116 r = a*sqrt(1+r*r);
00117 } else
00118 {
00119 times2pown(a,ex);
00120 times2pown(b,ex);
00121 dotprecision dot(0.0);
00122 accumulate(dot,a,a);
00123 accumulate(dot,b,b);
00124 r = dot;
00125 r = sqrt(r);
00126 times2pown(r,-ex);
00127 }
00128 stagprec = stagsave;
00129 }
00130 return r;
00131 }
00132
00133 l_real sqrt1px2(const l_real& x) throw()
00134
00135
00136 {
00137 l_real y,t;
00138 int stagsave, stagmax=19;
00139 stagsave = stagprec;
00140 if (stagprec > stagmax) stagprec = stagmax;
00141 if (expo(x[1]) > 260)
00142 {
00143 y = abs(x);
00144 t = 1/y;
00145 times2pown(t,-1);
00146 y += t;
00147 } else y = sqrt(1+x*x);
00148 stagprec = stagsave;
00149 y = adjust(y);
00150 return y;
00151 }
00152
00153 l_real power(const l_real& x, int n)
00154 {
00155 int stagsave = stagprec, stagmax = 19;
00156 long int zhi = 2;
00157 l_real y, neu;
00158 bool neg=false;
00159
00160 if (x == 1.0)
00161 y = x;
00162 else if (n == 0)
00163 y = adjust(_l_real(1.0));
00164 else
00165 {
00166 if (stagprec < stagmax)
00167 stagprec++;
00168 else
00169 stagprec = stagmax;
00170
00171 if (n == 1)
00172 y = x;
00173 else if (n == 2)
00174 y = x*x;
00175 else
00176 {
00177 if (n < 0)
00178 {
00179 neg = true;
00180 n = -n;
00181 }
00182
00183
00184 if (n%2)
00185 y = x;
00186 else
00187 y = 1.0;
00188
00189
00190 neu = x*x;
00191 do {
00192 if ((n/zhi)%2)
00193 y *= neu;
00194 zhi += zhi;
00195 if (zhi <= n)
00196 neu *= neu;
00197 } while (zhi <= n);
00198 if (neg)
00199 y = 1/(y);
00200 }
00201 stagprec = stagsave;
00202 y = adjust(y);
00203 }
00204 return y;
00205 }
00206
00207
00208 l_real Ln2_l_real() throw()
00209 { return mid( Ln2_l_interval() ); }
00210 l_real Ln10_l_real() throw()
00211 { return mid( Ln10_l_interval() ); }
00212 l_real Ln10r_l_real() throw()
00213 { return mid( Ln10r_l_interval()); }
00214 l_real Pid4_l_real() throw()
00215 { return mid( Pid4_l_interval() ); }
00216 l_real Sqrt2_l_real() throw()
00217 { return mid( Sqrt2_l_interval() ); }
00218 l_real Sqrt5_l_real() throw()
00219 { return mid( Sqrt5_l_interval() ); }
00220 l_real Sqrt7_l_real() throw()
00221 { return mid( Sqrt7_l_interval() ); }
00222 l_real Ln2r_l_real() throw()
00223 { return mid( Ln2r_l_interval() ); }
00224 l_real Pi_l_real() throw()
00225 { return mid( Pi_l_interval() ); }
00226 l_real Pid2_l_real() throw()
00227 { return mid( Pid2_l_interval() ); }
00228 l_real Pi2_l_real() throw()
00229 { return mid( Pi2_l_interval() ); }
00230 l_real Pid3_l_real() throw()
00231 { return mid( Pid3_l_interval() ); }
00232 l_real Pir_l_real() throw()
00233 { return mid( Pir_l_interval() ); }
00234 l_real Pi2r_l_real() throw()
00235 { return mid( Pi2r_l_interval() ); }
00236 l_real SqrtPi_l_real() throw()
00237 { return mid( SqrtPi_l_interval() ); }
00238 l_real Sqrt2Pi_l_real() throw()
00239 { return mid( Sqrt2Pi_l_interval() ); }
00240 l_real SqrtPir_l_real() throw()
00241 { return mid( SqrtPir_l_interval() ); }
00242 l_real Sqrt2Pir_l_real() throw()
00243 { return mid( Sqrt2Pir_l_interval() ); }
00244 l_real Pip2_l_real() throw()
00245 { return mid( Pip2_l_interval() ); }
00246 l_real Sqrt2r_l_real() throw()
00247 { return mid( Sqrt2r_l_interval() ); }
00248 l_real Sqrt3_l_real() throw()
00249 { return mid( Sqrt3_l_interval() ); }
00250 l_real Sqrt3d2_l_real() throw()
00251 { return mid( Sqrt3d2_l_interval() ); }
00252 l_real Sqrt3r_l_real() throw()
00253 { return mid( Sqrt3r_l_interval() ); }
00254 l_real LnPi_l_real() throw()
00255 { return mid( LnPi_l_interval() ); }
00256 l_real Ln2Pi_l_real() throw()
00257 { return mid( Ln2Pi_l_interval() ); }
00258 l_real E_l_real() throw()
00259 { return mid( E_l_interval() ); }
00260 l_real Er_l_real() throw()
00261 { return mid( Er_l_interval() ); }
00262 l_real Ep2_l_real() throw()
00263 { return mid( Ep2_l_interval() ); }
00264 l_real Ep2r_l_real() throw()
00265 { return mid( Ep2r_l_interval() ); }
00266 l_real EpPi_l_real() throw()
00267 { return mid( EpPi_l_interval() ); }
00268 l_real Ep2Pi_l_real() throw()
00269 { return mid( Ep2Pi_l_interval() ); }
00270 l_real EpPid2_l_real() throw()
00271 { return mid( EpPid2_l_interval() ); }
00272 l_real EpPid4_l_real() throw()
00273 { return mid( EpPid4_l_interval() ); }
00274 l_real EulerGa_l_real() throw()
00275 { return mid(EulerGa_l_interval() ); }
00276 l_real Catalan_l_real() throw()
00277 { return mid( Catalan_l_interval() ); }
00278
00279 }
00280