// Rascal, the Advanced Scientific CALculator // Copyright (C) 2001, Sebastian Ritterbusch (Rascal@Ritterbusch.de) // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more detauls. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // int rinterval_precision_init=0; int rinterval_precision1=1; int rinterval_precision2=10; using cxsc::SetPrecision; using cxsc::SetDotPrecision; inline void do_rinterval_precicison_init(void) { if(!rinterval_precision_init) { rinterval_precision_init=1; cout << SetPrecision(rinterval_precision1,rinterval_precision2); cout << SetDotPrecision(rinterval_precision1,rinterval_precision2); } } string output(const cxscinterval & a) { if(rinterval_precision2>=0) { string b; b << a; return b; } else { int p2=rinterval_precision2; int p1=rinterval_precision1; rinterval_precision(p1,0); string b; b << a; string beststring=b; real bestdiam=diam(stringinterval(b)); real optimal=diam(a); int p3; for(p3=1;p3<=-p2;p3++) { rinterval_precision(p1,p3); b=""; b << a; real now=diam(stringinterval(b)); if(now=0) { string b; b << real(a); return b; } else { int p2=rinterval_precision2; int p1=rinterval_precision1; rinterval_precision(p1,0); string b; b << real(a); string beststring=b; double bestdistance=fabs(a-stringtodouble(b).asDOUBLE()); int p3; for(p3=1;p3<=-p2;p3++) { rinterval_precision(p1,p3); b=""; b << real(a); double now=fabs(a-stringtodouble(b).asDOUBLE()); if(now>b; return b; } int rinterval_precision(int a) { if(a>300) a=300; if(a<-300) a=-300; cout << SetPrecision(rinterval_precision1=a,rinterval_precision2=a); cout << SetDotPrecision(rinterval_precision1=a,rinterval_precision2=a); return 0; } int rinterval_precision(int a,int b) { if(b>300) b=300; if(b<-300) b=-300; cout << SetPrecision(rinterval_precision1=a,rinterval_precision2=b); cout << SetDotPrecision(rinterval_precision1=a,rinterval_precision2=b); return 0; } int rinterval_showprecision(void) { cout << "Precision(" << rinterval_precision1 << "," << rinterval_precision2 << ")" << endl; return 0; }