Nano Hash - криптовалюты, майнинг, программирование

Как увидеть представление числа в двоичном формате с плавающей запятой

Например, у меня есть номер 0.1:

double n = 0.1;

Он представлен в формате IEEE-754 с обратным порядком байтов как:

0 01111111011 1001100110011001100110011001100110011001100110011010

Как я могу вывести 0.1 в этом двоичном формате?

05.10.2016

  • вы можете использовать метод Float.floatToIntBits 05.10.2016
  • @Survivor - Вы можете использовать - также это уже было сказано в ответе ниже. 05.10.2016

Ответы:


1

Чтобы преобразовать двойное число в двоичное, вам нужно вызвать 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)); (здесь вам понадобится переменная, чтобы иметь что-то, на что можно указать, в качестве альтернативы предоставить функцию и взять указатель на параметр).

Последнее предупреждение: вам нужно убедиться, что типы данных, которые вы используете, имеют одинаковый размер (т. е. они отображаются в точно такое же место в памяти), иначе вы столкнетесь с нарушениями прав доступа или другими неприятными вещами.

05.10.2016
  • отлично, спасибо, именно то, что я искал. Может быть, вы знаете, как сделать то же самое в C? 05.10.2016
  • @Maximus Я пока не могу проверить C, и я не профессиональный пользователь C, но я бы, вероятно, попробовал приведение указателя или структуру объединения, чтобы получить байты для числа, а затем проверить каждый бит по отдельности, зациклив и сдвинув. 05.10.2016
  • @Maximus Я попробовал онлайн-компилятор C и добавлю версию, которая должна работать или, по крайней мере, поможет вам начать работу. Однако вы можете добавить тег C для согласованности. 05.10.2016
  • большое спасибо за твою помощь. Я добавил к вопросу теги C и C++. 05.10.2016

  • 2

    Класс 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

    05.10.2016
  • Стоит отметить, что это не печатает начальные нули, чтобы сделать его шириной 32 бита. Вам нужно будет добавить их самостоятельно. 05.10.2016
  • спасибо, он вывел 111101110011001100110011001101 вместо 0.1, что не совпадает с тем, что я показал в своем вопросе. Скорее всего используется 32-битный формат, как я могу получить то же самое для 64-битного формального? 05.10.2016
  • @Maximus, попробуй с Double.doubleToLongBits(0.1) и Long.toBinaryString(). 05.10.2016
  • @ Томас, можешь опубликовать это как ответ? 05.10.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..