Как перевести 32-битное вещественное значение в текст

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 6 апр 2022.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    Как перевести 32-битное вещественное значение в текст
    я знаю что это умеет делать функция - sprintf
    просто хочется понять алгоритм этого действия
    если у вещественного числа нет дробной части
    то с этим я разобрался а вот если с дробью
    к примеру вещественное значение 1.1
    целое число единица дробное число тоже единица
    1066192077 - десятичный формат
    3F8CCCCD - шестнадцатеричный формат
    для разбора нам понадобится бинарный формат

    00111111100011001100110011001101

    0 - 1 бит знак числа
    01111111 - 8 бит экспонента
    00011001100110011001101 - 23 бита мантиса

    экспонента при целом числе (1) равна (127)
    это хоть и считается положительным значением экспоненты
    но при таком значение смещение в мантисе нулевое
    то есть все 23-бита мантисы отданы для значения дробной части

    00011001100110011001101

    значение этих бит в десятичном формате - 838861

    Кто в теме не подскажите
    как из этих бит мантисы получить значение дробной части
    то есть заявленную единицу
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    assch,
    3F8CCCCD16 = 0011.1111.1000.1100.1100.1100.1100.1101 = 0.01111111.00011001100110011001101
    знак = 0 → число >0
    экспонента = 01111111 = 127 + 0 → степень = 0
    (число ― 20)×2(23- 0)= 00011001100110011001101 = 838861
    число ― 1 = 838861/223= 838861/8388608 = 0,10000002384185791015625
    число = 0,10000002384185791015625 + 1 = 1,10000002384185791015625 ≈ 1,1

    больше внимания уделяйте разделам "WASM.ARTICLES" и "WASM.Публикации" :)
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    внимательно смотрим на мантиссу числа, для наглядности я выделил повторяющуюся группу из двух нулей и двух единиц: 00011001100110011001101 ≈ 0.0011.0011.0011.0011.0011.0011

    Лайфхак


    1. [math]n[/math]-разрядный двоичный код из чередующихся нулей и единиц, заканчивающийся на единицу, соответствует числу [math]\overbrace{01.01.01.01\cdots 01.01}^{n}=\frac{1}{3}(2^{n}-1)[/math]
    2. [math]n[/math]-разрядный двоичный код из чередующихся нулей и единиц, заканчивающийся на ноль, соответствует числу [math]\overbrace{10.10.10\cdots 10.10}^{n}=\frac{2}{3}(2^{n}-1)[/math]
    3. [math]n[/math]-разрядный двоичный код из чередующихся двух единиц и нуля, заканчивающийся на ноль, соответствует числу [math]\overbrace{110.110.110\cdots 110}^{n}=\frac{6}{7}(2^{n}-1)[/math]
    4. [math]n[/math]-разрядный двоичный код из чередующихся единицы и двух нулей, заканчивающийся на два нуля, соответствует числу [math]\overbrace{100.100.100\cdots 100}^{n}=\frac{4}{7}(2^{n}-1)[/math]
    5. [math]24[/math]-разрядный двоичный код из двух чередующихся нулей и двух единиц, соответствует числу [math]\overbrace{0011.0011.0011\cdots 0011}^{24}=\frac{3}{15}(2^{24}-1)=\frac{1}{5}(2^{24}-1)[/math]
    6. Если [math]24[/math]-разрядное двоичное число из двух чередующихся нулей и двух единиц сдвинуть вправо на [math]1[/math] разряд, тогда получим вашу мантиссу, соответствующую числу [math]\overbrace{0.0011.0011.0011\cdots 0011.001}^{24}=\frac{1}{2}\cdot\frac{1}{5}(2^{24}-1)=\frac{1}{10}(2^{24}-1)[/math]