2012-11-30 2 views
2

ptree를 프로그래밍 중이고 어떤 시점에서 (기본값으로) DBL_MAX를 넣어야합니다. 생성 된 XML 파일을 열 때 올바른 번호가 표시됩니다.부스트 프로퍼티 트리 put/get DBL_MAX

하지만 예외가 발생합니다 수를 얻을 수 ptree.get를 사용할 때 :

using boost::property_tree::ptree; 
ptree pt; 

double d=-DBL_MAX; 
double d2=-1.797693134862316e+308; 
double d3=-1.79769e+308; 

cout<<d<<endl; 
cout<<d2<<endl; 
cout<<d3<<endl; 

pt.put<double>("double", d); 
write_xml("test.xml", pt); 

cout << "totalEndTimeLowerBound: " << pt.get<double>("double")<<endl; 
//doesn't work with d and d2, but works with d3 

무엇이 오류가 발생할 수 있으며, 어떻게 그것을 해결할 수 있습니다 여기에 conversion of data to type "d" failed

을 내 코드입니까? 기본적으로

답변

2

, ptreestd::string로 그 값을 저장하고이 정밀 basic_stringstream를 사용하여 변환 : 그것은 잘못된 값으로 숫자를 반올림 있기 때문에 std::stringDBL_MAX를 변환 할 때

s.precision(std::numeric_limits<double>::digits10+1); 

이 문제가 나타납니다. 다음과 같은 코드로 확인하실 수 있습니다 : 비주얼 스튜디오를 사용

ptree pt; 
pt.put("min", -DBL_MAX); 
pt.put("max", DBL_MAX); 
cout << "Min=" << pt.get<string>("min") << std::endl; 
cout << "Max=" << pt.get<string>("max") << std::endl; 

, 그것은 인쇄 :

최소 = -1.797693134862316e + 308

최대 = 1.797693134862316e + 308

그러나 DBL_MAX1.7976931348623158e+308으로 정의되므로 인쇄 된 값이 한계를 벗어납니다.

몇 가지 해결 방법이 있지만 어느 것도 완벽하지 :

  • DBL_MAX보다 다른 기본 작은 값을 사용합니다. 예 : 1.797693134862315e+308.
  • bad_data 예외를 잡아 기본값이라고 가정합니다.
  • 사용자 지정 변환기에 새 형식을 등록하십시오. 예 : here을 볼 수 있습니다.
  • 저장된 값의 정밀도를 줄입니다. 다음 코드를 사용하여이 작업을 수행 할 수 있습니다

    namespace boost { namespace property_tree 
    { 
        template <typename Ch, typename Traits> 
        struct customize_stream<Ch, Traits, double, void> 
        { 
        static void insert(std::basic_ostream<Ch, Traits>& s, const double& e) { 
         s.precision(std::numeric_limits<double>::digits10-1); 
         s << e; 
        } 
        static void extract(std::basic_istream<Ch, Traits>& s, double& e) { 
         s >> e; 
         if(!s.eof()) { 
         s >> std::ws; 
         } 
        } 
        }; 
    } 
    
+0

감사 답변을 많이. 정말 도움이되었습니다. :) – Annah