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

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

22.11.2011, 18:40. Показов 17003. Ответов 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru