2017-02-13 2 views
-1

Я унаследовал проект, написанный на C, который использует реальный тип числа, отображаемый на число с плавающей запятой с множественной точностью из библиотеки многоточечной арифметики GNU (а) GMP).Как получить числа байтов числа реального типа, определенного в C, используя GMP

Во время выполнения, чтобы проверить количество байтов для этого вещественного типа номера, можно запустить:

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 байт, но структура 'Real' также включает в себя элементы для экспонента и знака, а может быть и другие вещи. Это остальные 8 байтов. – Barmar

+0

@ Барнар: Позвольте мне убедиться, что я вас понимаю: вы говорите, что я, по сути, правильно понял, что 16 байтов для десятичного числа? –

+0

Да, я так думаю. Если вы хотите быть уверенным, проверьте исходный код и посмотрите на объявление структуры для «Real». – Barmar

ответ

2

Идея GMP, ГНУ Multiple Precision Арифметика библиотека, является то, что он может обрабатывать несколько Precisions (и очень большие). Поэтому фиксированный размер, который 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 –

Смежные вопросы