2014-11-14 8 views
1

gmp와 mpfr을 제 환경에 설치했습니다. 지금은 이제 MPFR : 죄송합니다. mpf_class

#include <gmpxx.h> 
#include <mpfr.h> 
#include <mpf2mpfr.h> 

, 나는 어떤 가치가있는 mpf_class를 초기화 말할 성공적으로 할 수 있습니다

mpf_class x = 0.73; 

가 어떻게이 숫자의 죄를 얻기 위해 mpfr 사용할 수 있습니까? mpf_class를 mpf_class 밖에 필요로합니다. 예 :

mpf_class y = sin(x) 

분명히 작동하지 않는 것은 다음 중 하나입니다. mpfr_sin 함수가 있다는 것을 알았습니다. 다음과 같이 호출했습니다.

mpfr_sin(x, y, MPFR_RNDN); 

그러나이 방법도 제대로 작동하지 않았습니다. 그럼 어떻게해야 하죠? 내가 뭔가 잘못하고 있는거야?

+0

'x.get_mpf_t()'를 사용 하시겠습니까? 헤더의 순서를 바꿔서는 안됩니까? –

+0

'mpfr_sin (y.get_mpf_t(), x.get_mpf_t(), MPFR_RNDN);을 시도했는데'mpfr_sin과 일치하는 함수 호출이 없습니다 '라는 오류로 실패합니다. 내가 뭔가 잘못하고있는거야 ..? –

답변

1

mpf2mpfr.h 당신이 원하는 것을 아마 당신을 감사드립니다. 그것은 #define을 많이 포함하고 있으며 그 다음에 나오는 모든 것에 mpf 이름을 mpfr 이름으로 대체합니다. 자신의 케이스에서 제대로 작동 할 수있는 기회를 원한다면 을 gmpxx.h 앞에 포함해야합니다. 그러나 파일은 모든 것을 번역하지 않습니다. 다음은 (당신이 mpq_class로 변환하지 않는 한)이 글은 C++ 03을 컴파일 할 수 있습니다 :

#include <mpfr.h> 
#include <mpf2mpfr.h> 
void mpfr_get_q (mpq_ptr, mpfr_srcptr); 
#undef mpq_set_f 
#define mpq_set_f(x,y) mpfr_get_q(x,y) 
#include <gmpxx.h> 

int main(){ 
    mpf_class x=.73; 
    mpf_class y; 
    mpfr_sin(y.get_mpf_t(),x.get_mpf_t(),MPFR_RNDN); 
} 

하지만, 예를 들어, 번호 대신 포인터를 인쇄합니다 operator<<로 인쇄하려고합니다. C++ 11에서 제공되는 추가 함수는 더 많은 조정이 필요합니다. 비활성화하려면 #define __GMPXX_USE_CXX11 0보다 쉬우 며 gmpxx.h을 포함하십시오.

이 문제를 해결하는 데는 두 가지 방법이 있으며 두 가지 방법 모두 mpf2mpfr.h을 삭제하는 것으로 시작합니다. 첫 번째는 임시 mpfr_t를 만드는 것입니다 :

mpf_class x=.73; 
mpf_class y; 
mpfr_t xx; 
mpfr_t yy; 
mpfr_init_set_f(xx, x.get_mpf_t(), MPFR_RNDN); 
mpfr_init(yy); 
mpfr_sin(yy, xx, MPFR_RNDN); 
mpfr_get_f(y.get_mpf_t(), yy, MPFR_RNDN); 

두 번째는 완전히 MPF 드롭 만 mpfr 사용하는 것입니다. 그것의 webpage은 6 개의 C++ 래퍼를 나열합니다. 그 중 몇 개는 여전히 유지 관리됩니다.

+0

사실, 첫 번째 코드 (그냥 복사하여 붙여 넣기)를 실행 해 보았습니다. 그리고 이상한 오류가 나옵니다. gmpxx.h, 줄 1904 : __mpfr_struct에서 _mp_size라는 멤버가 없습니다. 그게 무슨 뜻 이죠? 고마워요! –

+0

나는 나의 대답을 업데이트했으나 근본적으로 mpf2mpfr.h는 나쁜 생각이다. –