# C++ How to write full precision of doubles into a .dat file

I have a program that does an Symplectic ODE integration (physics/mathematics) and I want to export the time series to an .dat file> However the numbers written in the dat file have only 6 digits precision. I write setprecision(15); before writing but it changes nothing. I also post a part of the code, without the actual ODE solver:

#include <iostream> #include <ctime> #include <cstdlib> #include <string> #include <sstream> #include <iomanip> #include <cmath> #define pi 3.14159265358979 using namespace std; int main(int argc, char **argv) { // many stuff here, probably irrelevant, ostringstream osE, osb, ospx; osb<<b; // using this, I can use some numbers into the file's name osE<<E; ospx<<px0; filenamex = "Antidot_v4_x(t)_E=" + osE.str() + "_px0=" + ospx.str() + "_b=" + osb.str() + ".dat"; ofstream file1( filenamex.c_str() ); file1<<t<<"\t"<<x0<<endl; while(i<=N){ i++; McLachanAtela(x, y, px, py, h); // Does the 4-step ODE solver. x are initial values and after the // function call x are final values after h time setprecision(15); file1<<t<<"\t"<<x<<endl; //I use this to write values in file } return 0; }

So when I open the file1 (it's not named file1) the values inside it are 6 digits numbers. How can I write full 16 digit accurate numbers? Thanks. For completeness I also post the void function called:

void McLachanAtela (double& previousx, double& previousy, double& previouspx, double& previouspy, double timestep){ // Atela Coefficients double c[4]={0.134496199277431089, -0.224819803079420805, 0.756320000515668291, 0.334003603286321425}; double d[4]={0.515352837431122936, -0.085782019412973646, 0.411583023616466525, 0.128846158365384185}; // Symplectic Algorithm (at dimensionless form) for(int j=0; j<4; j++){ //this is the derivative of the potential : previouspx = previouspx - d[j]*timestep*b*pi*sin(pi*previousx)*cos(pi*previousy)*(pow(cos(pi*previousx)*cos(pi*previousy),b-1)); previouspy = previouspy - d[j]*timestep*b*pi*sin(pi*previousy)*cos(pi*previousx)*(pow(cos(pi*previousx)*cos(pi*previousy),b-1)); previousx = previousx + c[j]*previouspx*timestep; previousy = previousy + c[j]*previouspy*timestep; //cout<<" dpx = "<<d[j]*timestep*b*pi*sin(pi*previousx)*cos(pi*previousy)*(pow(cos(pi*previousx)*cos(pi*previousy),b-1))<<endl; } }

## Answers

You need to inject set precision into the stream:

file1 << setprecision(15) <<