2017-02-13 9 views
-1

C로 작성된 프로젝트를 상속했습니다.이 프로젝트는 GNU 다중 정밀도 산술 라이브러리의 다중 정밀도 부동 소수점 숫자에 매핑 된 실수 유형을 사용합니다 GMP).바이트를 얻는 방법 GMP를 사용하여 C에서 정의 된 실수 타입 번호 부분을 계산합니다

런타임

, 이것은 실수 형의 바이트 수를 테스트하기 위해 I 실행할 수

printf("Storage size for Real type: %d bytes\n", sizeof(Real)); 

는 24 바이트, 즉 192 개 비트를 준다.

#define REAL_EPSILON 1e-24 
#define REAL_FORMAT "% 25.24Fe" 
#define REAL_IOTA 1e-96 
#define REAL_PRECISION 128 

사람이이 라인에 어떤 빛을 흘릴 수 :

그러나, 또한 클래스를 정의 파일은 다음과 선이? 특히 마지막 줄에 128 비트 또는 16 바이트가 소수의 소수 부분에 대한 바이트 수로 표시되는지 여부에 대해 우려하고 있습니다.

+0

즉, 가수는 16 바이트이지만, '실제'구조에는 지수와 부호, 그리고 다른 것들도 포함됩니다. 그것들은 다른 8 바이트입니다. – Barmar

+0

@ Barnar : 내가 너를 이해할 수있게 해준다. 16 바이트가 10 진수라고 생각하는 것이 본질적으로 옳은가? –

+0

예, 그렇게 생각합니다. 확실히 알고 싶으면 소스 코드를 확인하고'Real'에 대한 구조체 선언을보십시오. – Barmar

답변

2

GMP 뒤에 아이디어는 GNU 여러 정밀 산술 라이브러리, 그것은 여러 (매우 큰) 정밀도를 처리 할 수 ​​있다는 것입니다. 따라서 sizeof이 부동 소수점 데이터 형식으로 반환 할 수있는 고정 크기는 의미가 없습니다.

GMP 번호는 실제 데이터에 대한 포인터가 하나 이상 포함 된 헤더 구조체를 사용하여 구현됩니다. 여기에는 실제 번호가 저장됩니다. 수천 또는 수백만 비트가 저장되는 매우 큰 숫자 일 수 있습니다.

sizeof은 내장 C 연산자이며 헤더 구조체의 크기를 제공합니다. 이 결과는 헤더 구조체가 24 바이트임을 의미합니다. 이 아닌은 정밀도 또는 자릿수와 관련이 있습니다.

+0

@MrMorgan :'mpf_set_default_prec (128);에서와 같이? 그러면 기본 정밀도가 (최소한) 128 비트가됩니다. –

+0

그러한 명시적인 지시를 확인해야합니다. 어떤 문서에 기본 128 비트 정밀도가 사용된다는 내용이 나와 있습니다. –

+0

GMP를 호출하는 코드가이를 설정합니다. 자세한 내용은 여기를 참조하십시오 : https://gmplib.org/manual/Floating_002dpoint-Functions.html#Floating_002dpoint-Functions –