преобразовать двойное значение в двоичное значение - PullRequest
5 голосов
/ 09 февраля 2010

Как я могу преобразовать двойное значение в двоичное значение.

у меня есть какое-то значение, подобное этому ниже 125252525235558554452221545332224587265 Я хочу преобразовать это в двоичный формат ... так что я держу его в двойном, а затем пытаюсь преобразовать в двоичный (1 & 0) .. я использую C # .net

Ответы [ 5 ]

11 голосов
/ 09 февраля 2010

Ну, вы не указали платформу или какой бинарный код вас интересует, но в .NET есть BitConverter.DoubleToInt64Bits, который позволяет вам получить IEEE 754 бита, составляющих оценить очень легко.

В Java есть Double.doubleToLongBits, который делает то же самое.

Обратите внимание, что если у вас есть значение, например "125252525235558554452221545332224587265", то вы получите больше информации, чем двойник может точно сохранить в первую очередь.

6 голосов
/ 09 февраля 2010

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

int i;
union {
 double x;
 unsigned char byte[sizeof (double)];
} converter;

converter.x = 5.5555555555556e18;

for(i = 0; i < sizeof converter.byte; i++)
  printf("%02x", converter.byte[i]);

Если вы вставите это в main() и запустите, оно может напечатать что-то вроде этого:

~/src> gcc -o floatbits floatbits.c
~/src> ./floatbits
ba b5 f6 15 53 46 d3 43

Обратите внимание, что это, конечно, зависит от платформы в ее порядке байтов . Вышеприведенное относится к системе Linux, работающей на процессоре Sempron, то есть с прямым порядком байтов.

0 голосов
/ 10 февраля 2010

Для этих огромных чисел (которые не могут быть точно представлены с помощью двойного) вам нужно использовать какой-то специализированный класс для хранения необходимой информации.

C # предоставляет десятичный класс:

Тип десятичного значения представляет десятичные числа в диапазоне от положительных 79,228,162,514,264,337,593,543,950,335 до отрицательных 79,228,162,514,264,337,593,543,950,335. Тип десятичного значения подходит для финансовых расчетов, требующих большого количества значащих целых и дробных цифр и без ошибок округления. Тип Decimal не устраняет необходимость округления. Скорее, это минимизирует ошибки из-за округления. Например, следующий код выдает результат 0,99999999999999999999999999999, а не 1.

Если вам нужна большая точность, чем эта, вам нужно создать свой собственный класс, я думаю. Здесь есть один для целых: http://sourceforge.net/projects/cpp-bigint/, хотя, похоже, для с ++.

0 голосов
/ 09 февраля 2010

Двойное значение уже является двоичным значением. Это просто вопрос представительства, которое вы хотите иметь. В языке программирования, когда вы называете его двойным, язык, который вы используете, будет интерпретировать его одним способом. Если вам случается вызвать один и тот же кусок памяти как int, то это не тот же номер.

Так что это зависит от того, что вы действительно хотите ... Если вам нужно записать это на диск или в сеть, то вам нужно подумать о BigEndian / LittleEndian.

0 голосов
/ 09 февраля 2010

Если вы имеете в виду, что хотите сделать это сами, тогда это не вопрос программирования.

Если вы хотите, чтобы компьютер делал это, самый простой способ - использовать процедуру ввода с плавающей запятой, а затем отобразить результат в его шестнадцатеричной форме. В C ++:

double f = atof ("5.5555555555556E18");
unsigned char  *b = (unsigned char *) &f;
for (int j = 0; j < 8;  ++j)
    printf (" %02x", b [j]);
...