Численное преобразование в C/C++

Мне нужно преобразовать C/C++ double в 64-битное дополнение до двух, где точка Radix находится в битовом номере 19 (включительно).

Это означает, что для формата, который я хочу преобразовать в

  • 0x0000 0000 0010 0000 это число 1
  • 0xFFFF FFFF FFF0 0000 это число -1
  • 0x0000 0000 0000 0001 is 0.95 x 10^-6
  • 0xFFFF FFFF FFFF FFFF равен -0,95 x 10^-6

До сих пор я думал об использовании функции modf из стандартной библиотеки C, но на самом деле это не покрывает моих потребностей. Я также просмотрел некоторые классы преобразования типов в Boost, но и там не нашел подходящего решения. Кто-нибудь знает библиотеку или простой способ сделать это преобразование? Может быть, кто-то, более знакомый с Boost, может указать мне правильное направление.

Если это поможет, вот некоторая документация о том, как хранится.

Редактировать:

У меня есть дополнительный вопрос, это действительно для моего собственного интереса. Что такое «Радикс»? Здесь это что-то вроде десятичной точки. Но единственный другой раз, когда я слышал термин Radix, был, когда я изучал дискретное быстрое преобразование Фурье. Если я правильно помню, метод Radix-II является быстрым, потому что для вычисления ДПФ требуется меньше умножений.


person devin    schedule 24.07.2009    source источник


Ответы (2)


Это должно дать желаемые результаты:

double d = someValue();
int64_t fixed_point = static_cast<int64_t>(d * (1024*1024));
person Steve Jessop    schedule 24.07.2009
comment
Я бы предпочел написать d * 0x100000, так как это делает более очевидным, где вы размещаете основание. Хотя личный вкус. - person VoidPointer; 25.07.2009
comment
Хорошая точка зрения. В реальной жизни я ожидаю, что он будет использоваться более чем в одном месте и, вероятно, должен быть именованной константой. Но для 44,20-битной фиксированной точки шестнадцатеричный литерал, вероятно, понятнее, чем десятичный. - person Steve Jessop; 25.07.2009

Умножьте на 2 ^ 20, а затем преобразуйте в целочисленный тип, на который вы нацелены (вероятно, длинный длинный)

person AProgrammer    schedule 24.07.2009