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

Преобразование десятичного float в шестнадцатеричный

09.03.2019, 11:17. Показов 3733. Ответов 7

Студворк — интернет-сервис помощи студентам
Как можно преобразовать и вывести десятичный float в шестнадцатеричную и восьмеричную систему счисления на С++ ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.03.2019, 11:17
Ответы с готовыми решениями:

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

Преобразование десятичного числа в шестнадцатеричное
помогите плыз)) написать программу которая преобразует введенное пользователем десятичное число в шестнадцатеричное

Преобразование десятичного числа в дробь
Собственно не могу придумать код реализации десятичного числа в дробь(например 0.75 = 1/3), может кто подкинет идейку?=)

7
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
09.03.2019, 11:21
Думаю, имеет смысл сначала в двоичную, например, через atof или строковый поток.
А потом каждые 4 бита отобразить соответствующей 16-ичной цифрой.
Например так:
Преобразование десятичного числа в шестнадцатиричное
только вместо int нужно взять double
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.03.2019, 11:40
Целая и дробная часть преобразуются по разному. Как преобразуется целая - хорошо известно. Преобразование дробной части почему-то известно менее. Хотя столь же просто. Но по другому.
Дробная часть умножается на 16 (или на основание той системы, куда переводится)
Целая часть полученного число будет очередной цифрой. Она записывается и отсекается.
Процесс продолжается столько раз, какова требуемая точность представления. Сам по себе он может никогда не кончится, т.к. образуется период.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
float x, xdrob; 
int xint;
char s[100];
int t = 10; // требуемая точность
xint = (int)x;
xdrob = x - xint;
  // Перевод xint -> s ....
  // ......
char *p = s + strlen(s);
*(p++) = '.';
for(int i=0; i<t; i++) {
  xdrob *= 16;
  int z = (int) xdrob;
  xdrob -= z;
  char dig = (0<=z && z<=9) ? '0' + z : 'a' + z - 10;
  *(p++) = dig;
}
*p = '\0';
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.03.2019, 12:13
Строго говоря, изначальная постановка задачи выглядит несколько неправильной. Число, хранящееся во float, изначально представлено неточно для большинства значений. Т.е. в 16-ричном виде напечатать можно только то, что уже хранится во float (т.е. после потери точности)

Цитата Сообщение от Байт Посмотреть сообщение
Сам по себе он может никогда не кончится, т.к. образуется период
Во float'е число "записано" в двоичной системе в соответствии со стандартом IEEE-754. Т.е. число имеет конечную запись в двоичном представлении. При переводе в 16-ричное представление запись так же будет конечной, поэтому здесь не может быть периодической дробной части

Цитата Сообщение от Байт Посмотреть сообщение
Преобразование дробной части почему-то известно менее. Хотя столь же просто. Но по другому.
Дробная часть умножается на 16 (или на основание той системы, куда переводится)
"Известно менее", судя по всему, по той причине, что такое никому в общем-то и не нужно. Ну а коль скоро ты рядом с этим предложением поставил предложение "Как преобразуется целая - хорошо известно", то здесь хотелось бы тоже возразить. То, о чём ты скорее всего подумал, на самом деле не есть "преобразование". Это есть построение записи числа. А пример из поста #3 - это действительно "преобразование". Кто-то, но не ты, преобразовал вещественное число в его двоичную "запись" - в формат IEEE-754. А дальше ты преобразуешь эту запись из двоичной формы в 16-ричную, пользуясь операцией умножения. Честно говоря, я не настолько хорошо знаком с тем, как устроены машинные операции, на надеюсь, что умножение на 16 всё-таки приведёт к действительно точной работе над экспотенциальной частью

В идеале постановка задачи должна выглядеть как преобразование ЗАПИСИ вещественного числа в десятичной форме в 16-ричную форму. Всё остальное (включая и эту тему) - это половинчатые решения, когда кто-то (но не автор программы) уже перевёл ИЗ десячтиной записи, а автор переводит только В N-ричную систему
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.03.2019, 15:25
Evg, Когда идет речь о системах счисления, имеется в виду именно запись представление числа в виде
X = a0b0 + a1b1 + + a2b2 + ... для целой части и
c1b-1 + c2b-2 + + c3b-3 + ... то есть о нахождении этих наборов {ai} (конечного) {ci} (потенциально бесконечного).
А на бумажке (на экране) это записывается так X = anan-1...a0.c1c2...
Можно придумать и другую запись этих наборов, но эта наиболее распространенная.
Исторически сложилось так, что в машине число представлено (записано!) в виде последовательности двоичных цифр. Это совершенно верно для целых чисел, но не совсем так для типов float и double. Там отдельно, в разных частях слова записывается мантисса и порядок. Но все эти вещи число случайные, в том смысле, что они не влияют на само число, как сущность. Типа - "так сделали". Были машины (так сделанные), записывающие числа в троичной системе счисления и даже троичной сбалансированной (все это можно прочесть у Кнута) и для них все твои слова просто неверны.
Что касаемо моего поста, я просто показал, как число (сущность) перевести в запись в любой системе счисления. Для этого достаточно, чтобы над числом, как сущностью, можно было производить 2 операции - умножение на b(основание системы) и деление на него... Да, простите, еще 2 - взятие остатка и отсечение целой части. А уж как операции эти производятся - дело десятое. Как и то, что деление и умножение на степени двойки можно сделать просто сдвигом, и что в данном случае получится конечная последовательность, коли мы имеем дело с двоичной машиной.
Но этот раздел - С++. И языку в общем-то плевать на представление данных в машине. А приведенный мной алгоритм будет работать и на троичной машине...

Добавлено через 7 минут
Впрочем, по поводу языка я не совсем точен. В нем есть операции побитового сдвига. Но вот реализовать эти операции на ЭВМ "Сетунь" https://ru.wikipedia.org/wiki/... 0%B5%D1%80) было бы не так просто, как на IBM-PC. Пришлось бы функции писать

Добавлено через 40 минут
Цитата Сообщение от Evg Посмотреть сообщение
, по той причине, что такое никому в общем-то и не нужно.
Тут я с тобой, пожалуй, соглашусь. Вот я не вижу каких-то задач, за исключением чисто учебных, где это представление могло бы пригодиться. (что вовсе не значит, что их нет) Хотя, кто знает? Может быть представление числа Пи в какой-то из с/с позволило бы раскрыть какие-то тайны мироздания? А ведь помимо с/с с фиксированным основанием, есть еще смешанные, факториальная, например.
В то время как представление целых чисел в различных с/с (особенно в смешанных) позволяет грамотно организовать различные переборные задачи. И не только. Например, в вопросе о представлении массивов с неизвестным заранее количеством измерений - там они и к селу, и к городу...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.03.2019, 15:41
Цитата Сообщение от Байт Посмотреть сообщение
Что касаемо моего поста, я просто показал, как число (сущность) перевести в запись в любой системе счисления
Да. Именно об этом я и писал. Ну у тебя это было названо термином "преобразование", который обычно используют в контексте вида "преобразование из N-ричной записи в M-ричную запись". Поэтому это навлекло на подозрения, что ты делаешь стандартную ошибку, путая понятия "число" и "запись числа". А на фразе "Сам по себе он может никогда не кончится, т.к. образуется период" подозрения стали ну очень сильными. Потому и полез в объяснения

Цитата Сообщение от Байт Посмотреть сообщение
и для них все твои слова просто неверны
Каюсь, я прочитал в посте 2 про группировку по 4 бита и, не вникнув в твой код, поспешил сделать вывод, что ты делал примерно тоже самое в своём примере, но над дробной частью

Добавлено через 3 минуты
Цитата Сообщение от Байт Посмотреть сообщение
Вот я не вижу каких-то задач, за исключением чисто учебных, где это представление могло бы пригодиться
С этим беда. Судя по тому, что я вижу на форуме, очень сильно подозреваю, что большинство преподавателей сами толком не понимают, чем отличается "число" от "записи числа". И уже давно махнул рукой на то, чтобы пытаться это людям объяснить. В какой-то степени уже выработалось предубеждение, что в каждой теме все всё понимают не правильно, потому и случился такой казус, что полез обсирать код, как следует его не посмотрев
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.03.2019, 15:52
Цитата Сообщение от Evg Посмотреть сообщение
у тебя это было названо термином "преобразование"
Ну, я это слово взял из стартового поста, и употребил просто, чтобы не множить понятия. Хотя, что ж в нем плохого? Любое действие переводящее слово из одного алфавита в слово в другом алфавите (в частности и том же самом) можно назвать преобразованием.
Более того, любая программа (даже неправильная) именно этим, и ничем более другим, не занимается...

Добавлено через 5 минут
Цитата Сообщение от Evg Посмотреть сообщение
И уже давно махнул рукой на то, чтобы пытаться это людям объяснить
Поддерживаю, коллега.
Правда иногда, под настроение, когда чувствую, что могу сказать какие-то новые слова, тогда влезаю. Но без особой надежды, что поймут. Так, "потрендеть", как говорит один мой дружок из Закарпатья...
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
09.03.2019, 15:58
Байт, Evg, я всегда говорил, главное это понимание. Пожалуй это самой главное что есть в бытие.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.03.2019, 15:58
Помогаю со студенческими работами здесь

Преобразование десятичного числа в двоичное
Написать консольное приложение которое преобразует введенное пользователем с клавиатуры десятичное число в двоичное =)) помогите))

Преобразование десятичного числа в шестнадцатиричное
Нашел на форуме вот такую программку: string inttohex(int a) { string tmp(&quot;&quot;); do { int r(a%16); ...

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

Преобразование string в float
подскажите как оптимальнее преобразовать число в формате CString -1E+008, которое я получаю из Excel-я. Может существуют стандартные...

Преобразование String в float
Добрый день уважаемые форумчане. Подскажите пожалуйста как преобразовать String в float. Заранее благодарен.


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru