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

Kumpulan Source Code Greenfoot

Menyembunyikan Failed Load Images di Blogger

Kode Greenfoot Game Flappy Bird

Algorithma Bilangan Prima dengan Javascript

Checking Data yang Belum Dimasukkan dalam Daftar Menggunakan Query Google Sheet

Kebodohan Karyawan Menyalahkan Sistem

Algorithma Coretan Abstrak dengan HTML5 Canvas

Mencoba Submit Theme di Wordpress.org

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