2014-04-12 4 views
4

Boost Multiprecision library 문서에 분명하게 될 때, boost::multiprecision::cpp_intboost::multiprecision::cpp_dec_float A와 변환하는 간단하다 :boost :: multiprecision :: cpp_int을 (를) cpp_dec_float <0> (cpp_dec_float_50 등이 아닌)으로 변환하는 방법?

// Some interconversions between number types are completely generic, 
// and are always available, albeit the conversions are always explicit: 

cpp_int cppi(2); 
cpp_dec_float_50 df(cppi); // OK, int to float // <-- But fails with cpp_dec_float<0>! 

고정 폭에 cpp_int에서 부동 소수점 형식으로 변환 할 수있는 기능 (즉, cpp_dec_float_50)은 cpp_int에서 임의 길이 라이브러리 부동 소수점 유형 (예 : cpp_dec_float<0>)으로 변환 할 수 있다는 희망을 제시합니다. 그러나 이것은 작동하지 않습니다. 다음의 간단한 예제 프로그램을 보여줍니다로 변환, 비주얼 스튜디오 2013 년 나를 위해 실패

#include <boost/multiprecision/number.hpp> 
#include <boost/multiprecision/cpp_int.hpp> 
#include <boost/multiprecision/cpp_dec_float.hpp> 

int main() 
{ 
    boost::multiprecision::cpp_int n{ 0 }; 
    boost::multiprecision::cpp_dec_float<0> f{ n }; // Compile error in MSVC 2013 
} 

그것은 이 예상대로 cpp_dec_float_50로 변환 성공 않지만, 언급 한 바와 같이, 나는 임의의로 변환 바라고 정밀 부동 소수점 유형 : cpp_dec_float<0>.

오류 파일 <boost/multiprecision/detail/default_ops.hpp>에, 내부 부스트 Multiprecision 코드에서 코드의 다음 코드에 표시

:

template <class R, class T> 
inline bool check_in_range(const T& t) 
{ 
    // Can t fit in an R? 
    if(std::numeric_limits<R>::is_specialized && std::numeric_limits<R>::is_bounded 
     && (t > (std::numeric_limits<R>::max)())) 
     return true; 
    return false; 
} 

오류 메시지는 다음과 같습니다

오류 C2784 : 'enable_if : : result_type, detail :: expression :: result_type>, bool> :: type boost :: multiprecision :: operator> (const boost :: multiprecision :: detail :: expression (3210), CONST 부스트 :: multiprecision :: 자세히 :: 표현 &) ' 가 템플릿 인수를 추론 할 수없는'const를 부스트 :: multiprecision :: 자세히 :: 표현 & ' 에서'const를 next_type '

처럼 부동 소수점 유형으로 고정 소수점 이하 자릿수로 변환하는 대신 boost::multiprecision::cpp_intboost::multiprecision::cpp_dec_float<0>으로 변환 할 수 있습니까?

(내 프로그램에서는 부동 소수점 인스턴스가 하나만 인스턴스화되며 이는 거의 업데이트되지 않으므로이 인스턴스가 많은 메모리를 차지하고 오래 걸리는 것이 좋습니다. 정말 큰 숫자를 지원하는 시간입니다.)

고마워요!

답변

5

나는 부스트 Multiprecision과 많은 경험이 없어,하지만 템플릿 클래스 cpp_dec_float<>는 그들이 백엔드 부르는 나에게 것, 그리고 당신은 그것을 사용하기 위해 number<> 어댑터를 포장 할 필요가 산술 형.Live On Coliru

#include <boost/multiprecision/number.hpp> 
#include <boost/multiprecision/cpp_int.hpp> 
#include <boost/multiprecision/cpp_dec_float.hpp> 
#include <iostream> 

namespace mp = boost::multiprecision; 

int main() 
{ 
    using Int = mp::cpp_int; 

    // let's think of a nice large number 
    Int n = 1; 
    for (Int f = 42; f>0; --f) 
     n *= f; 

    std::cout << n << "\n\n"; // print it for vanity 

    // let's convert it to cpp_dec_float 
    // and... do something with it 
    using Dec = mp::number<mp::cpp_dec_float<0> >; 
    std::cout << n.convert_to<Dec>(); 
} 

는 출력 : convert_to<>이 허용

1405006117752879898543142606244511569936384000000000 

1.40501e+51 

경우,도 작동합니다 명시 적 변환 생성자, 내가 기대 :

는 여기에 필자의

Dec decfloat(n); 
+0

위대한! 나는 이것을 아마 내일 시도 할 것이고 그것이 나에게도 효과가 있는지 알려줄 것이다. –

+0

@Gracchus 잘리지 않습니까? 정밀도는 완전 충실도입니다. 기본적으로 화면 표시는 기본값이 아닙니다. 왜? 글쎄, 페이지에서 실행되는 숫자가 거의 유용하지 않기 때문입니다. 사람들은 30 자리 넘는 숫자를 읽는 데 어려움을 겪습니다 ... 완전한 정밀도의 직렬화가 필요한 경우 부스트 직렬화를 사용하십시오. – sehe

+0

@ Gracchus 방금 [반올림 질문] (http://stackoverflow.com/a/23033117/85371)에 대한 답변을 마무리했습니다. 나는 조금 더 일찍 시간이 부족했고 도서관과 혼동을 느꼈다 :/나는 프리젠 테이션 질문에 대해 곧 살펴 보도록하겠습니다. – sehe