Konversi Angka Scientific ke Double dalam File dengan C++

Suatu hari, istri penulis mendapatkan data dalam bentuk file data.dat, dengan tiap data diberikan dalam bentuk angka scientific. Data tersebut seperti dibawah ini:

8.0488800e-01 -1.5277600e+01
8.0845880e-01 -1.5270800e+01
8.1202960e-01 -1.5250700e+01
8.1560039e-01 -1.5217400e+01
8.1917119e-01 -1.5171500e+01
8.2274199e-01 -1.5113700e+01
8.2631278e-01 -1.5045000e+01
8.2988358e-01 -1.4966600e+01
8.3345438e-01 -1.4880000e+01
8.3702518e-01 -1.4787100e+01
8.4059597e-01 -1.4690300e+01

Untuk keperluan perhitungan numerik, data diatas perlu dibaca dengan kode C++.

Ternyata, dalam perhitungan angka scientific tersebut perlu dirubah dahulu ke type data double.

Berikut ini adalah kode C++ untuk merubah angka scientific ke double, sebagai file kode.cpp, yang outputnya disimpan ke file lain, out.dat.

#include <iostream> 
#include <fstream> 
#include <string> 
#include <stdio.h> 
#include <cmath> 
#include <sstream> 
 
using namespace std; 
 
double sciToDub(const string& str) 
{ 
 try { 
  stringstream ss(str); 
  double d = 0; 
  ss >> d; 
  if (ss.fail()) { 
    return nan(""); 
  }else return d; 
   }catch (string& e) { 
      return nan(""); 
   } 
} 
 
int getNumData(string a) 
{ 
 int num=0; 
 ifstream myfile(a); 
 if (myfile.is_open()){ 
  while (myfile.good()) 
  { 
    string line; 
    getline(myfile,line); 
    stringstream ssin(line); 
    int j=0; 
    while(ssin.good() && j<1){ 
     string word; 
     ssin>>word; 
     if(!isnan(sciToDub(word)))j++; 
     else break; 
    } 
    if(j>0)num++; 
  } 
  myfile.close(); 
 } 
 return num; 
} 
 
int main(int argc, char *argv[]) 
{ 
 if(argv[1]==NULL || argv[2]==NULL){ 
  cout<<"Data not entered!"<<endl; 
  return 0; 
 } 

 double *x,*y; 
 int n=getNumData(argv[1]); 
 x=new (nothrow)double[n]; 
 y=new (nothrow)double[n]; 

 cout<<"Num data : "<<n<<endl; 

 ifstream myfile(argv[1]); 
 if (myfile.is_open()){ 
  int i=0; 
  while (myfile.good()) 
  { 
    string line; 
    getline(myfile,line); 
    stringstream ssin(line); 
    int j=0; 
    while(ssin.good() && j<2){ 
     string word; 
     ssin>>word; 
     double d=sciToDub(word); 
     if(!isnan(d)){ 
      if(j==0){ 
     x[i]=d; 
      }else{ 
     y[i]=d; 
      } 
      j++; 
     }else break; 
    } 
    if(j>0)i++; 
  } 
  myfile.close(); 
 }else cout << "Unable to open file"; 

 ofstream outfile; 
 outfile.open(argv[2]); 
 for(int i=0;i<n;i++){ 
  outfile<<x[i]<<" "<<y[i]<<endl; 
 } 
 outfile.close(); 

 return 0; 
} 

Penulis menggunakan compiler C++ untuk Windows MinGW, dengan kode kompilasi sebagaimana berikut:

g++ kode.cpp -o kode.exe
kode.exe data.dat out.dat

File out.dat adalah file output hasil konversi, dimana isinya kurang lebih seperti di bawah ini:

0.808459 -15.2708
0.81203 -15.2507
0.8156 -15.2174
0.819171 -15.1715
0.822742 -15.1137
0.826313 -15.045
0.829884 -14.9666
0.833454 -14.88
0.837025 -14.7871

Komentar



Postingan populer dari blog ini

Kumpulan Source Code Greenfoot

Algorithma Coretan Abstrak dengan HTML5 Canvas

Game TicTacToe dengan Greenfoot

Honeycomb Style Wallpaper dengan HTML5 Canvas

Cara Membuat Halaman HTML Sederhana

Kode Greenfoot Game Snake Sederhana

Melihat Alamat Berbentuk QR Code di Undangan Pernikahan

Algoritma Tombol Putar dengan Greenfoot

Tips Agar Website Anda Segera di Terima oleh Google Adsense dan di-Monetize

Selamatan Latar Glundengan Bubuk Banyuwangi