Changeset 3577 in Sophya for trunk/SophyaLib/SysTools


Ignore:
Timestamp:
Feb 20, 2009, 12:17:14 AM (17 years ago)
Author:
ansari
Message:

amelioration format conversion double->string pour eviter perte de precision lors des evaluations avec l'interpreteur (Commander) - Reza 19/02/2008

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/SysTools/commander.cc

    r3383 r3577  
    1717
    1818namespace SOPHYA {
     19
     20//--------------------------------------------------
     21// Pour ecrire une valeur double sous forme de string
     22// sans perte de precision, et si possible de maniere
     23// lisible (%g, sinon %.17e) 
     24static char cval_strbuff_[64];
     25char * cval_dble2str(double v)
     26{
     27  char* str1 = cval_strbuff_; 
     28  sprintf(str1,"%g",v);
     29  char* str2 = cval_strbuff_+32;       
     30  sprintf(str2,"%.17e",v);
     31  double x1 = atof(str1);
     32  double x2 = atof(str2);
     33  double fx = fabs(v);
     34  if (fx>0. && fabs(x2-x1)/fx>1e-12)  return str2;
     35  else return str1;
     36}
     37//--------------------------------------------------
    1938
    2039// Differents code de retour specifiques
     
    219238      break;
    220239      }
    221     sprintf(buff, "%g", f);
    222     string lvv = buff;
     240    string lvv = cval_dble2str(f);
    223241    rcc = ExecuteOnce(lvv);
    224242    if (rcc == CMD_BREAKEXE_RC)  return rcc;
     
    10571075        res = cex.Value();
    10581076      }
    1059       char cbuff[64];
    1060       sprintf(cbuff,"%g",res);
    1061       string vv = cbuff;
     1077      string vv =  cval_dble2str(res);
    10621078      SetVariable(kw, vv);
    10631079    }
     
    18051821    RPNExpressionEvaluator rpn(tokens, 1);
    18061822    double res = rpn.Value();
    1807     char cbuff[64];
    1808     sprintf(cbuff,"%g",res);
    1809     string vv = cbuff;
     1823    string vv = cval_dble2str(res);
    18101824    SetVariable(tokens[0],vv);
    18111825    return 0;
Note: See TracChangeset for help on using the changeset viewer.