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

Apps Script untuk Cetak Sertifikat

Algorithma FPB dan KPK dengan Javascript

Cara Menentukan Arah Kiblat Menggunakan Google Maps

Menampilkan Undetermined Circle Progressbar di Java

Genetics Algorithm Method with Progressive Error Prediction

Kode Java Membandingkan Dua File

Tutorial Upload File ke Google Drive dari Website

Kaidah Baku untuk Konsistensi Data (PT, Tbk, Pty., & Ltd.)

Generate Karakter Acak dan Menempatkannya di Sel Google Sheets dengan Apps Script

Peringatan: Aksi Penipuan Skimming Melalui Aplikasi Android M-Pajak