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

Может ли кто-нибудь сказать мне, как я могу преобразовать это число с плавающей запятой: 12,25 в двоичный? Я знаю, как преобразовать "12", но не 0,25

Любая помощь горячо приветствуется. Спасибо


person Slim Black    schedule 17.10.2010    source источник
comment
Вручную :) Я могу сделать это программно после этого.   -  person Slim Black    schedule 17.10.2010
comment
Да :) Мне нужно знать, как вычислить 0,25 в двоичном формате   -  person Slim Black    schedule 17.10.2010
comment
Каков ваш алгоритм для 12? Я думаю, что тот же алгоритм будет работать точно так же для .25, возможно, только с изменением 2 на 1/2.   -  person Ken    schedule 17.10.2010
comment
Для 12 я просто продолжаю делить его на 2 и получаю остатки.   -  person Slim Black    schedule 17.10.2010
comment
Проверьте это: http://kipirvine.com/asm/workbook/floating_tut.htm   -  person PSS    schedule 29.01.2011
comment
Удаленный пост ниже связан с блогом, который прекрасно понимает, как числа с плавающей запятой хранятся на диске, и должен быть полезным. blog.penjee.com/binary-numbers-floating-point-conversion   -  person Eric Leschinski    schedule 25.10.2017


Ответы (6)


Продолжайте умножать число после запятой на 2, пока оно не станет 1,0:

0.25*2 = 0.50
0.50*2 = 1.00

и результат в обратном порядке: 0,01

person Abhi    schedule 17.10.2010
comment
@Slim Black: Осторожно: это прекрасно работает для чисел вроде 0,25, которые имеют точное представление в двоичном виде, но не для чисел вроде 0,1, которые не имеют: 0,1 * 2 = 0,2, 0,2 * 2 = 0,4, 0,4 * 2 = 0,8. , 0,8 * 2 = 1,6, 0,6 * 2 = 1,2, 0,2 * 2 = 0,4, ... Это повторяется вечно, и результат равен 0,0 (0011) (повторяется часть в скобках). - person Rick Regan; 18.10.2010
comment
@Slim Black: И обратите внимание, чтобы правильно реализовать это программно, вам понадобится десятичная арифметика — см. мою статью exploringbinary.com/base-conversion-in-php-using-bcmath, в частности раздел dec2bin_f() .) - person Rick Regan; 18.10.2010

Рассмотрим пример ниже

Преобразовать 2,625 в двоичный формат.

Целую и дробную часть будем рассматривать отдельно.

The integral part is easy, 2 = 10. 

Для дробной части:

0.625   × 2 =   1.25    1   Generate 1 and continue with the rest.
0.25    × 2 =   0.5     0   Generate 0 and continue.
0.5     × 2 =   1.0     1   Generate 1 and nothing remains.

Таким образом, 0,625 = 0,101 и 2,625 = 10,101.

См. эту ссылку для получения дополнительной информации.

person Govind Prabhu    schedule 12.12.2015

(d означает десятичный, b означает двоичный)

  1. 12.25d - ваш поплавок.
  2. Вы пишете 12d в двоичном формате и удаляете его из своего поплавка. Остается только остаток (0,25d).
  3. Ты пишешь точку.
  4. Пока остаток (0,25d) не равен нулю (и/или вы хотите больше цифр), умножьте его на 2 (-> 0,50d), удалите и запишите цифру слева от точки (0) и продолжайте с новым остатком (0,50d).
person comonad    schedule 17.10.2010
comment
Что делать, если мой поплавок равен 5,1? Делая ваши шаги, я попал в бесконечный цикл, пожалуйста, помогите! - person nautilusvn; 12.08.2014
comment
@nautilusvn: поскольку нет степени 2, которая также кратна 10, это число имеет бесконечную последовательность цифр. вы можете где-то прервать свои вычисления. - person comonad; 20.08.2014
comment
@nautilusvn хм, да, хотя не ноль - глупое утверждение ... изменить это. - person comonad; 08.08.2016

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

Но мы можем преобразовать число с плавающей запятой в двоичное через указатель.

#include <stdio.h>

int main()
{
    float a = 7.5;
    int i;
    int * p;

    p = &a;
    for (i = sizeof(int) * 8 - 1; i >= 0; i--)
    {   
        printf("%d", (*p) >> i & 1); 
    }   

    return 0;
}

Вывод

0 10000001 11100000000000000000000

Пробелы добавлены для уточнения, они не включены в программу.

person ilango victor    schedule 11.02.2016
comment
Я знаю, что это старо, но какое здесь значение i? - person Michi; 20.05.2017
comment
Я в порядке, я думаю, вам нужно заменить его в своем ответе:)) - person Michi; 06.04.2018

person    schedule
comment
возможно, вы также хотите добавить ссылку на то, откуда вы это взяли. этот код Python кажется мне знакомым. - person Kin Cheung; 18.01.2016

person    schedule
comment
Привет. Добро пожаловать на СО. Спасибо за ваш код, но не могли бы вы немного объяснить, как он решает проблему? - person Krzysztof Madej; 02.11.2020