2011-11-20 1 views
0

CSV에서 한 줄씩 읽으며 쉼표로 구분 된 값을 토큰 화합니다. 각 토큰은 문자열 유형입니다. 그리고 그것을 float 타입의 벡터에 넣을 것입니다. 예를 들어 csv의 값이 "0.08", * beg = "0.08"이고 벡터의 값이 "0.079999998"이면벡터에서 push_back을 할 때 정밀도를 설정하십시오.

여기에 정밀도를 설정할 수 있습니까? 3 자릿수 또는 무언가로 벡터.

예 :

string line; 
boost::char_separator<char> sep(","); 
typedef boost::tokenizer< boost::char_separator<char> > t_tokenizer; 
ifstream myfile (fileName); 

if(myfile.is_open()) 
{ 
    while (myfile.good()) 
    { 
     getline (myfile,line); 
     t_tokenizer tok(line, sep); 

     for (t_tokenizer::iterator beg = tok.begin(); beg != tok.end(); ++beg) 
     { 
      string temp = *beg; 
      this->v.push_back(::atof(temp.c_str())); 
     } 
+3

* "그러나 벡터에서"0.079999998 ""* - 어떻게 알 수 있습니까? –

+0

디버깅 할 때 벡터를 확인합니다. – Lexicon

답변

1

귀하는 을 사용하여 데이터를 보유하고 있음을 의미하는 atof을 사용하고 있습니다. 부동 소수점 값은 기본 -10 값을 예상대로 정확하게 유지하지 않습니다. 이렇게 간단한 숫자는 좋은 이진 표현을 갖지 못할 수도 있습니다. 제대로 부정확와

  1. 거래 :

    당신은 몇 가지 옵션이 있습니다. 부동 소수점을 처리 할 때는 항상 정밀도를 알고 있어야하므로, 소수점 둘째 자리까지 표시하려면 적절한 반올림을 수행하고 원하는대로 항상 작동합니다.

  2. 정수만 사용하십시오. 소수점 이하 2 자리의 정밀도 만 필요하면 int에 100을 곱한 값을 저장하십시오. 0.088으로 저장됩니다. 직접이 형식으로 구문 분석 할 함수를 작성하십시오.

6

이 플로트에 문제가되지 않습니다. 당신은 정확히 0.8 나타낼 수는 없지만, 걱정 - 단순히 출력 원하는 정밀도 값은 :

#include <iomanip> // for fixed and setprecision 
#include <iostream> // for cout 
#include <cstdio> // for printf 

for (auto it = v.cbegin(), end = v.cend(); it != end; ++it) 
{ 
    std::cout << std::fixed << std::setprecision(3) << *it << std::endl; 
} 

또는, std::printf("%.3f\n", *it)을 사용할 수 없습니다.

정확한 값을 데이터 구조에 저장하려면 일반 수레를 사용할 수 없습니다. 정수의 고정 소수점 해석 (예 : 1/1000 단위로 모든 것을 측정) 또는 소수 부동 소수점 (희귀)을 사용하거나 합리적인 수 (정수 몫)를 저장할 수 있습니다. 덧셈과 뺄셈 만하면 고정 소수점을 사용하는 것이 자연스러운 방법입니다.

+0

.07998 대신 .08 값을 조작해야하므로 벡터에서 .08 값을 지정해야합니다. 예를 들어 각 값을 .001 씩 마이너스하고 2를 곱해야합니다. – Lexicon

+0

@Lexicon : 마지막 단락을 다시 읽습니다. 일반적인 float *는 0.08의 값을 취할 수 없습니다. 일반적인 정수는 1/3의 값을 가질 수 없기 때문입니다. –