Извлечение цифр из поплавка C ++ - PullRequest
5 голосов
/ 16 декабря 2011

Дано double x и предполагается, что оно лежит в [0,1].Предположим, например, что x = 0.3 В двоичном коде (с сохранением 10 цифр после десятичной точки) он представлен как

x=0.0100110011...

Я хочу написать некоторый код C ++, который будет извлекать 10 цифр, показанных после десятичной дробиточка.Другими словами, я хочу извлечь целое число (0100110011) _2.

Теперь я совершенно новичок в битовом сдвиге, и (наивное) решение, которое у меня есть для этой проблемы, следующее

int temp= (int) (x*(1<<10))

Тогда temp в двоичном коде будет иметь необходимые 10 цифр.

Это безопасный способ выполнить описанный выше процесс?ИЛИ есть более безопасные / более правильные способы сделать это?

Примечание : я не хочу, чтобы цифры извлекались в виде массива символов.Я специально хочу целое число (или целое число без знака) для этого.Причиной этого является то, что при генерации октодей точкам в пространстве присваиваются хеш-ключи в зависимости от их положения, называемого Morton Keys.Эти ключи обычно хранятся как целые числа.После получения целых ключей для всех точек они затем сортируются.Теоретически эти ключи могут быть получены путем масштабирования координат до [0,1], извлечения битов и их чередования.

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

Используйте memcpy, чтобы скопировать double в массив 32-битных чисел, например:

unsigned int b[2]; // assume int is 32-bits
memcpy(b, &x, 8);

Большинство 10 значащих двоичных цифр находятся в b[0] или b[1], в зависимости от того, является ли ваша машина старшим или младшим порядковым номером.

РЕДАКТИРОВАТЬ: то же самое может быть достигнуто с помощью некоторого приведения вместо memcpy, но это нарушит строгие правила наложения имен. Альтернативой является использование union.

0 голосов
/ 16 декабря 2011

Прочитайте это: http://chrishecker.com/images/f/fb/Gdmfp.pdf

Если вы можете понять, что говорит эта статья, вы можете получить алгоритм, который вы ищете.Просто запомните фактор смещения в показателе степени и неявный ведущий в мантиссе, а остальные должны встать на свои места.

...