как я могу извлечь мантиссу двойного - PullRequest
12 голосов
/ 15 апреля 2011

Я хотел бы сохранить в переменной мантиссу двойного

У меня есть код для получения двоичного представления двойного: нажмите здесь

Что я должен изменить, чтобы изолировать мантиссу

Ответы [ 3 ]

18 голосов
/ 15 апреля 2011

В <math.h>

double frexp (double value, int *exp)

разложить VALUE по экспоненте и мантиссе.

double ldexp (double value, int exp)

делает наоборот.

Чтобы получить целочисленное значение, у вас естьумножить результат frexp на показатель FLT_RADIX DBL_MANT_DIG (они доступны в <float.h>. Чтобы сохранить это в целочисленной переменной, вам также нужно найти подходящий тип (часто 64-битный тип)

Если выЕсли вы хотите обрабатывать 128-битный код удвоения в некоторых реализациях, вам потребуется C99 frexpl, чтобы выполнить разбиение, и тогда у вас, вероятно, нет подходящего целочисленного типа для хранения полного результата.

3 голосов
/ 15 апреля 2011

Многие системы Linux имеют / usr / include / ieee754.h , который определяет битовые поля для float, double и long double в формате IEEE: вы можете тривиально «перенести» его в случае необходимости.

2 голосов
/ 15 апреля 2011

Код здесь немного опасен с точки зрения переносимости, но вот он ...

#include <cstdint>

float myFloat = 100;
int32_t mantissa1 =
    reinterpret_cast<int32_t&>(myFloat) & (((int32_t)1 << 24) - 1);

double myDouble = 100;
int64_t mantissa2 =
    reinterpret_cast<int64_t&>(myDouble) & (((int64_t)1 << 53) - 1);
...