Частина 12 - Дебагування float

Давайте переглянем наш приклад. 0x05XMD_float.c as слідує.

#include <stdio.h>
#include "pico/stdlib.h"

int main() 
{
  stdio_init_all();

  while(1) 
  {
    float x = 40.5;

    printf("%f\n", x); 

    sleep_ms(1000);
  }

  return 0;
}

Давайте запустимо наш дебагер.

radare2 -w arm -b 16 0x05_float.elf

Давайте зробимо аналіз автоматично.

aaaa

Давайте спробуємо потрапити до головної частини програми.

s main

Давайте перейдемо в візуальний режим, натиснувши V і потім p два рази, щоб потрапити до хорошого дебагерського перегляду.

Ми бачимо форматний вказівник в [0x0000033c].

:> psz @ [0x0000033c]
%f

Float знаходиться в [0x00000340].

:> pff @ [0x00000340] 0x00004000 = 9.32830524e-09

Не хвилюйтеся, що float не дуже точний, оскільки ця машина x64. Що важливо побачити - це значення 0x00004000. Тоді ви запитаєте себе, а чому це не 40.5? Що відбувається?

Ок...

Pico не має власного математичного процесора, тому воно обробляє float і double за допомогою програмного забезпечення. Тому 0x00004000 буде представленням 40.5 у десятковому вигляді.

Також, наприклад, якщо значення було 40.4, воно було б 0x00003333. Наперекір цьому, 40.6 було б 0x00004ccc.

Давайте подивимося на наступну таблицю, яка допоможе ілюструвати цю ідею.

0x3ff00000 = 1.000000 0x3ff00001 = 1.000001 0x3ff00002 = 1.000002... 0x3ff0000f = 1.000015 0x3ff00010 = 1.000016 0x3ff00011 = 1.000017
etc...

Остаточні значення в цих 4 байтах (32-біти) визначатимуть значення float.

У наступному урокі ми змінимо float і продемонструємо цю логіку.

results matching ""

    No results matching ""