Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/86: Рейтинг темы: голосов - 86, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 20.11.2011
Сообщений: 13

Представление числа float в двоичной системе

22.11.2011, 18:40. Показов 17280. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задачка такая - написать программу наСи!!!, которой мы задаем число типа float, а она выдает его нам так как его видит компьютер(в двоичной системе?).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2011, 18:40
Ответы с готовыми решениями:

Функция: вычислить значение числа по записи этого числа в двоичной системе счисления
Назначение: вычисляет десятичное значение целого числа по заданной строке символов s, который является записью этого числа в двоичной...

Заменить все встречающиеся в тексте числа на эти же числа в двоичной системе счисления
Условие задачи: На планете Роботов очень не любят десятичную систему счисления, поэтому они попросили Вас написать программу, которая...

Представление float в двоичной системе
Смысл: требуется написать программу, показывающую двоичную структуру float. Запускаем: вводится первое число с плавающей запятой,...

40
0 / 0 / 0
Регистрация: 20.11.2011
Сообщений: 13
23.11.2011, 14:40  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Evg Посмотреть сообщение
Тогда как понимать твою фразу "насколько я понял первый знак в двоичном коде обозначает знак исходного числа(-\+) в вашей программе не отображается это"? "Это" - это что?
т.е. если задать программе отрицательное число, то программа пропускает минус и преобразовывает только само число, а по идее она должна вначале нового числа поставить 0.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
23.11.2011, 16:01
Цитата Сообщение от Eaax Посмотреть сообщение
т.е. если задать программе отрицательное число, то программа пропускает минус и преобразовывает только само число, а по идее она должна вначале нового числа поставить 0
Это скорее всего дефект программы по вычислению количества лидирующих нулей. Лучше поищи программу, которая печатает число в двоичном представлении. На форуме их море. И выбери то, что работает. А ещё лучше - немного напрягись и напиши сам: там писать-то 5 строк
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.11.2011, 16:29
Цитата Сообщение от Eaax Посмотреть сообщение
т.е. если задать программе отрицательное число, то программа пропускает минус и преобразовывает только само число, а по идее она должна вначале нового числа поставить 0.
исходные данные:
C++
1
f= -12.345
вывод:
Bash
1
00011111100001010100010111000001
У тебя так?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
23.11.2011, 16:46
Вариант из поста #9 печатает "c145851f" (что заведомо правильно)
Если перевести твою печать в 16-ричный формат, то получится "1f8545c1". Т.е. твоя печать в неправильном порядке рисует байты. Потому что не учитывает, что intel - little endian и по меньшим адресам находится младшая часть, а не старшая
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
23.11.2011, 16:55
а какие биты отвечают за порядок мантиссы в double?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.11.2011, 16:57
Evg, с вами мы потом разберёмся. Чё там и как у меня печатает, я знаю. Что называется as is
Пока же:
Eaax, слушай меня внимальтельно. Начни не стого, КАК программа преобразовавает число. Начни с того ЧТО она преобразовывает

Итак,
C++
1
double f=- 12.456
Что сие значит?
Пишем:
C++
1
2
3
double f=- 12.456;
printf ("%x\n", &f );
getchar ();
Запускаем программу. Видим адрес числа f. Вопрос ЧТО лежит по этому адресу?
Для того, чтобы нам это узнать, идём ко мне в личку и получаем адрес, с котрого скачиваем отладчик OllyDbg, тратим часа 2 на его изучение.

После этого повторяем шаги и приаттачиваемся отладчиком к запущенному процессу. Находим там адрес, например 22ff48 и наблюдаем (см. вложение) что там по этому адрес. Видим:
1f854541

Четыре байта, как и положено.
Понял? Именно эта муть и есть -12.345
Если тебя интересует, как именно машина преобразует 1f854541->12.345 разбирайся.

А я же пока обращу твоё внимание на нули и единицы.
Цель: преобразовать 1f854541 в ноли и единицы. Как- твои дела, я же воспоьлзуюсь сторонним инструментом-калькулятором (спроси меня, где я его взял) и вижу:
C++
1
2
3
4
1f==  00011111
85== 10000101
4C== 01001100
41== 01000001
(внимание! если f положительное, то третий байтне 4C, а 45, то есть 01000101)
...А если будет размер float другой, то 8 байт Будет, например

Вот, собсно и всё. И не гадай на кофейноё гуще где там должно чё быть, посмотри что называется своими глазами. Ставь мне плюс, а то я я в прошлый раз ничё не получил.

...Код из поста номер 10- самый лучший код из всех, которые ты видел, там одно слабое место- нестандартная функция itoa, но я тебя предупредил. Не слушай никого, короче.

//////////////////////////////////////////////////////////////////////////////////////////////
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.11.2011, 17:09
вот картинка, там адрес и чё по нему лежит. Прошу прощения, -12.456 выглядит как :
1F8545C1, а не 1f854541
Но не суть.
Миниатюры
Представление числа float в двоичной системе  
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
23.11.2011, 17:12
Цитата Сообщение от kravam Посмотреть сообщение
внимание! если f положительное, то третий байтне 4C, а 45, то есть 01000101
а ничего что за знак отвечает старший бит? Поправьте если я не прав
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.11.2011, 17:20
Чё-то я напутал похоже, 12.456 есть:
C74B4741

Добавлено через 59 секунд
11000111 01001011 01000111 01000001
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
23.11.2011, 17:25
Цитата Сообщение от kravam Посмотреть сообщение
Пишем:
C++
1
2
3
double f=- 12.456;
printf ("%x\n", &f );
getchar ();
Ты этот пример вообще запускал?

Цитата Сообщение от kravam Посмотреть сообщение
вот картинка, там адрес и чё по нему лежит. Прошу прощения, -12.456 выглядит как :
1F8545C1, а не 1f854541
Но не суть.
А теперь заведи переменную типа int, запиши туда единицу и получи такую же картинку. По картинке у тебя будет 01000000. Не странно ли?

Добавлено через 41 секунду
Цитата Сообщение от kravam Посмотреть сообщение
Чё-то я напутал похоже, 12.456 есть:
C74B4741
Т.е. картинка врёт?

Добавлено через 59 секунд
Да, кстати, чтобы не мучиться, где там старшая часть, а где младшая, возьми два значения 1.0 и -1.0 и посмотри двоичное представлени
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.11.2011, 17:51
Всё, путаницу ликвидировал
C++
1
2
3
  float f = -12.345;
  printf ("== %x",  (unsigned int)&f);
  getchar ();
C++
1
2
3
  float f = 12.345;
  printf ("== %x",  (unsigned int)&f);
  getchar ();
А вот соответственно картинки, первая для отрицательного дробного числа, вторая для положительного.

То есть моя задача щас чтобы автор научился сам так наблюдать значения ячеек памяти.
Миниатюры
Представление числа float в двоичной системе   Представление числа float в двоичной системе  
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
23.11.2011, 18:07
Цитата Сообщение от kravam Посмотреть сообщение
Всё, путаницу ликвидировал
C++
1
2
3
  float f = -12.345;
  printf ("== %x",  (unsigned int)&f);
  getchar ();
В очередной раз хочется спросить. Ты сам запускал этот код?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.11.2011, 18:09
Да и вот вывод:
C++
1
== 22ff48
потом отладчик ну и далее по плану.
...А в чём прикол-то?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
23.11.2011, 18:14
Цитата Сообщение от kravam Посмотреть сообщение
...А в чём прикол-то?
Добавь ещё одну и печать и посмотри на результат

C
1
2
3
4
5
float f = -12.345;
printf ("== %x",  (unsigned int)&f);
f = 100500.23;                        /* <--- добавлено */
printf ("== %x",  (unsigned int)&f);  /* <--- добавлено */
getchar ();
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
23.11.2011, 18:15
Цитата Сообщение от Evg Посмотреть сообщение
Да, кстати, чтобы не мучиться, где там старшая часть, а где младшая
Цитата Сообщение от Evg Посмотреть сообщение
Добавь ещё одну и печать и посмотри на результат
жжешь
у меня что-то не сходится (в смысле не понимаю)
вот код
C
1
2
3
4
5
6
7
int main()
{
    double x = 15;
    printf("%16llx\n", *((long long *)&x));
 
    return 0;
}
выход 0x402e000000000000 меня интересует конкретно длина поля, выделенного под порядок мантиссы, ну и разные уточнения. Итак, я понимаю что под порядок выделено 11 бит 62 - 52 включительно. Эта часть содержит в себе степень основания СС в которую впоследствии возводится мантисса. Теоретическая формула
https://www.cyberforum.ru/cgi-bin/latex.cgi?15_{10} = f_{16}=0.f_{16}* 10_{16}^{1}=401f000000000000_{D}
где D - формат представления числа с плавающей точкой в эвм. почему расходятся цифры? Почему старший бит порядка всегда равен 1, это связано с тем что порядок (для условности p) не может быть https://www.cyberforum.ru/cgi-bin/latex.cgi?-2^{10} \leq \, p \, < \, 2^{10} - 1 ?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.11.2011, 18:25
Цитата Сообщение от Evg Посмотреть сообщение
Добавь ещё одну и печать и посмотри на результат

Код C
1
2
3
4
5
float f = -12.345; printf ("== %x", (unsigned int)&f); f = 100500.23; /* <--- добавлено */ printf ("== %x", (unsigned int)&f); /* <--- добавлено */ getchar ();
C++
1
== 22ff6c== 22ff6c
...прикол-то в чём?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
23.11.2011, 18:41
alkagolik, см. http://www.softelectro.ru/ieee754.html раздел 7.5

1 бит знак, 11 бит экспонента, 52 бита мантисса

0x402e000000000000 в двоичном виде будет 0100000000101110000.... жирным выделена мэкспонента (порядок)

Цитата Сообщение от alkagolik Посмотреть сообщение
Почему старший бит порядка всегда равен 1
Потому что порядок может быть и положительный и отрицательный. Реально в этих 11 битах записан "порядок + bias". bias (в таблице по ссылке оно отмечено как "смещение") - некоторая величина, определяющая нулевой порядок на середину диапазона, отведённого для порядка. Для double bias равен 1023. Т.е реальный порядок это 10000000010 - 01111111111 = 11. Правда хз куда девать старшие биты мантиссы (и почему они отличны от нуля)

Если ты задашь число меньшее единицы, то в старшем бите порядка будет ноль (что после вычитания bias'а будут означатьотрицательную степень)

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
...прикол-то в чём?
Я грешным делом подумал, что ты так значение печатаешь, не заметил, что ты про адрес писал.

Добавлено через 4 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Правда хз куда девать старшие биты мантиссы (и почему они отличны от нуля)
Торможу. Три единички мантиссы означают 1/2 + 1/4 + 1/8. При этом целая часть всегда равна единице. Таким образом математическая запись быдет выглядеть как mant=1.111, exp=11. Что есть (1 + 1/2 + 1/4 + 1/8) * (2 ^ 3) = 15
1
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
23.11.2011, 18:44
Цитата Сообщение от kravam Посмотреть сообщение
...прикол-то в чём?
прикол в том что ты смотришь не значение, а адрес ячейки памяти, в которой лежит значение (число).
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
23.11.2011, 18:54
Цитата Сообщение от alkagolik Посмотреть сообщение
прикол в том что ты смотришь не значение, а адрес ячейки памяти, в которой лежит значение (число)
А он и смотрел адрес. Чтобы потом по этому адресу в отладчике посмотреть, что записано
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.11.2011, 18:57
Evg, слов нет. Ты же меня знаешь.
++++++++++++++++++++++++++++++++++++++++ +++++++
Ладно, а теперь займёмся вплотную тык скыть работой над ошибками.

Цитата Сообщение от Evg Посмотреть сообщение
Понтяно. Тогда делается просто:

Код C
1
2
3
4
5
6
7
float f;
int x = *((int*)&f);

/* А дальше печатаем в двоичном виде переменную "x", т.к. она
* является битовой копией переменной "f". Для печати в двоичном
* представлении можно использовать любую готовую процедуру,
* которая, как правило, намного короче, чем пример из поста #10 */
Ну собсно, тут всё понятно. Этот способ я не стал побовать использовать из-за возможной разности размеров int и float

Так что если учитывать ввиду эту разницу, необходим промежуточный буфер. Ну и как следствие, трудности с переводом в двоичную систему. Ибо к буферу ту же itoa просто так не применишь, даже если привести указатель на него к int*.
А всё опять же из-за возможной разницы в размерах типов.

Добавлено через 1 минуту

Не по теме:

кто научит меня редактировать код, тот мой друг

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2011, 18:57

Представление числа в двоичной системе счисления
Можете объяснить как люди выражают цифры в двоичном системе счисления к примеру цифру 94 - типа одна цифра делится на 4. Ну типа того:...

Обьяснить представление числа в двоичной системе
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;iomanip&gt; #include &lt;windows.h&gt; #include...

Описать функцию DecToBin(N), возвращающую представление числа в двоичной системе счисления
Описать функцию DecToBin(N) строкового типа, возвращающую строковое представление целого неотрицательного числа N в двоичной системе...

Программа должна вывести представление переданного её числа в нега-двоичной системе счисления
Нега-двоичная система счисления – это система счисления с основанием (-2). Основное преимущество нега-двоичной системы счислении –...

Описать функцию, которая возвращает строковое представление целого числа N в двоичной системе счисления
Описать функцию, которая возвращает строковое представление целого числа N в двоичной системе счисления. Используя эту функцию , получить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru