2011-08-10 5 views
1

b_int64 인 경우를 가정 해 봅시다. sqrt((long double)a)*sqrt((long double)b)을 고정밀 80 비트 부동 소수점으로 계산해야합니다.C/C++에서 80 비트 부동 소수점 연산

예. (__int64)(sqrt((long double)a)*sqrt((long double)a) + 0.5) != a 많은 경우에 있어야합니다.

어떤 Win32 C/C++ 컴파일러가 80 비트 부동 소수점 연산을 관리 할 수 ​​있습니까?

+1

C ** 또는 ** C++ 컴파일러? * one *을 선택하거나 명시 적으로 필요하다고 말하십시오. –

+1

'long double sqrtl (long double x); –

+0

WTP : win32/amd64 용 C 또는 C++ 컴파일러가 될 수 있습니다. 나에게 중요하지 않아. – amuliar

답변

2

정수의 제곱근을 취하기 위해 부동 소수점을 사용하지 않아야합니다. 특히 일부 시스템에서는 지원되지 않으며 약 (sqrtl) 일 수 있습니다. 정확하지 않은 숫자가 long double입니다. 대신 정수 제곱근 알고리즘을 찾아보십시오.

+0

더 어렵습니다 .64 비트 정수에 대한 방정식의 솔루션 시스템을 찾고 있는데, INTEGER NUMBER sqrtl (a) * sqrtl (b)의 형식은 가능한 솔루션의 가장 간단한 표현입니다. – amuliar

+0

I 부동 소수점을 사용하지 않고도 정수에서 제곱근을 직접 수행 할 수있는 방법이 있음을 의미합니다. –

1

Embarcadero의 C++ Builder는 80 비트 부동 소수점을 처리합니다. 긴 double 유형 또는 (Delphi에서 가져온) Extnded 유형을 사용하십시오. 그들은 동일합니다.

+0

예, 80 비트이지만 실패했습니다. a = 8642673492431640625L; 델파이의 결과 : 8642673492431640624. 볼랜드 C++ 컴파일러 5.5 : 8642673492431640200 – amuliar

+0

좋아, 그냥 시도 :'unsigned __int64 a = 8642673492431640625L; 긴 이중 ld = a; printf ("% 0.1Lf \ n", ld);'그리고 인쇄 :'8642673492431640625.0', 나에게 맞는 것 같습니다. 그것은 C++ Builder XE에있었습니다. –

2

sqrt()가 long double에 유효합니까?

sqrt()는 double 형이고 sqrtf()는 float 형이고 sqrtl()은 long double 형입니다.

+0

예. math.h의 버전은 다음과 같습니다 : long double sqrt (long double) – amuliar

+1

' '에 선언 된'sqrt()'함수는 double 형을위한 것이 아니라 double 형을위한 것입니다. 'sqrtl()'은 long double 형입니다. 그러나 ''에 정의 된 "유형 일반 매크로"'sqrt()'도 있습니다 (컴파일러에서 지원하는 경우 비교적 새로운 기능입니다). –

+0

@amuliar : "sqrt"가 아니라 "sqrtl"이라고합니다. –

관련 문제