WedX - журнал о программировании и компьютерных науках

Отображение представления с плавающей запятой IEEE 754 в GDB?

Когда я прошу GDB напечатать вещественное число в двоичном формате, я получаю следующее:

(gdb) p/t 5210887.5
$1 = 10011111000001100000111

Согласно этому,

0 10010101 00111110000011000001111

является ожидаемым значением.

Выравнивая их,

         1 0011111000001100000111
0 10010101 00111110000011000001111

И похоже, что GDB дает мне целочисленное представление после округления. Дело в том, что он делал это и с переменной на работе. Использование объявления в программе C -

main()
{
  float f = 5210887.5;
}

и его отладка -

$ gcc -g -O0 floatdec.c -o floatdec
$ gdb floatdec
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/ /floatdec...done.
(gdb) b main
Breakpoint 1 at 0x804839a: file floatdec.c, line 3.
(gdb) r
Starting program: /home/ /floatdec 

Breakpoint 1, main () at floatdec.c:3
3         float f = 5210887.5;
(gdb) s
4       }
(gdb) p f
$1 = 5210887.5
(gdb) p/t f
$2 = 10011111000001100000111

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

02.05.2015

Ответы:


1

Формат t действительно преобразует значение в целое число. Из gdb: Форматы вывода:

t
   Print as integer in binary. The letter ‘t’ stands for “two”.

Это подтверждается кодом в print_scalar_formatted gdb:

if (options->format != 'f')
    val_long = unpack_long (type, valaddr);

где unpack_long преобразует различные типы значений, включая float, в long.

Обходной путь состоит в том, чтобы взять адрес переменной, преобразовать его в (int32 *) и разыменовать его.

(gdb) p f
$2 = 5210887.5
(gdb) p/t *(int32_t *)&f
$3 = 1001010100111110000011000001111
(gdb) p/t {int32_t}&f
$4 = 1001010100111110000011000001111

Или, на независимом от языка уровне, с помощью команды x:

(gdb) x/tw &f
0xbffff3f4: 01001010100111110000011000001111

Это было сделано на x86. Системы с другим порядком байтов могут создавать другую битовую комбинацию.

03.05.2015
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]