Например, у меня есть номер 0.1
:
double n = 0.1;
Он представлен в формате IEEE-754 с обратным порядком байтов как:
0 01111111011 1001100110011001100110011001100110011001100110011010
Как я могу вывести 0.1
в этом двоичном формате?
Например, у меня есть номер 0.1
:
double n = 0.1;
Он представлен в формате IEEE-754 с обратным порядком байтов как:
0 01111111011 1001100110011001100110011001100110011001100110011010
Как я могу вывести 0.1
в этом двоичном формате?
Float.floatToIntBits
05.10.2016 Чтобы преобразовать двойное число в двоичное, вам нужно вызвать Double.doubleToLongBits(x)
и Long.toBinaryString(x)
.
Так что можешь попробовать String binary = Long.toBinaryString( Double.doubleToLongBits(0.1) );
Чтобы получить полное 64-битное представление, вам нужно будет добавить столько нулей, сколько необходимо.
Изменить:
Поскольку вы просили версию C, я попытаюсь добавить ее (хотя я не эксперт C, поэтому я могу пропустить что-то вроде функций std lib):
#include <stdio.h>
#include <stdint.h>
union binary {
double d;
uint64_t l;
} binary;
int main() {
union binary b;
b.d = 0.1; //set the value as double
uint64_t bin = b.l; //read the value as 64-bit unsigned integer
char c[65];
c[64] = '\0'; //string terminator
//iterate from 63 to 0
for( int i = sizeof(uint64_t) * 8 - 1; i >= 0; i--) {
if( bin & 1 ) {
c[i]='1';
} else {
c[i]='0';
}
bin >>= 1; //right-shift by 1, i.e. 0010 -> 0001 etc.
}
printf("%s\n",c);
return 0;
}
Это в основном использует структуру объединения, которая позволяет вам писать двойное число и получать доступ к байтам как 64-битное целое число без знака (также известное как long long). Затем код перебирает копию этого целого числа, проверяет, установлен ли последний бит, устанавливает соответствующий элемент массива символов и, наконец, сдвигает биты вправо на 1.
Обратите внимание, что с некоторым приведением указателя вы можете сделать то же самое без структуры объединения: double dbl = 0.1; uint64_t bin = *((uint64_t*)(&dbl));
(здесь вам понадобится переменная, чтобы иметь что-то, на что можно указать, в качестве альтернативы предоставить функцию и взять указатель на параметр).
Последнее предупреждение: вам нужно убедиться, что типы данных, которые вы используете, имеют одинаковый размер (т. е. они отображаются в точно такое же место в памяти), иначе вы столкнетесь с нарушениями прав доступа или другими неприятными вещами.
Класс Float может сделать это за вас, вызвав метод Float.floatToIntBits
final int intBits = Float.floatToIntBits(4.1f);
final String binary = Integer.toBinaryString(intBits);
System.out.println(binary);
здесь вы можете проверить настройку суеты в двоичном результате...
https://www.h-schmidt.net/FloatConverter/IEEE754.html
111101110011001100110011001101
вместо 0.1
, что не совпадает с тем, что я показал в своем вопросе. Скорее всего используется 32-битный формат, как я могу получить то же самое для 64-битного формального? 05.10.2016 Double.doubleToLongBits(0.1)
и Long.toBinaryString()
. 05.10.2016
C
? 05.10.2016C
для согласованности. 05.10.2016C
иC++
. 05.10.2016