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 Julianday dengan Java

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

Balapan Santai Kediri-Malang tiap Hari Senin Pagi

Jasa Penjadwalan Semester, UTS dan UAS Perguruan Tinggi menggunakan Google Sheet

Ketika Pengelola Basis Data Terabaikan

Menyikapi Ucapan AI Pejabat

Tutorial Upload File ke Google Drive dari Website

Menyembunyikan Failed Load Images di Blogger

Besar Pajak Tahunan Honda Versa 2016 di Tahun 2022