Превратить int в IEEE 754, извлечь показатель степени и добавить 1 к показателю степени - PullRequest
0 голосов
/ 31 марта 2019

Задача

Мне нужно умножить число без использования оператора * или + или других библиотек, только двоичная логика

Чтобы умножить число на два с использованием нормы IEEE, вы добавляете единицу к показателю степени, например:

12 = 1 10000010 100000(...)

Таким образом, показатель степени: 10000010 (130)

Если я хочу умножить его на 2, я просто добавляю к нему 1, и оно становится 10000011 (131).

*

1018 Вопрос * Если я получу число с плавающей запятой, как я могу превратить его в двоичный код, тогда норма IEEE? Пример: 8.0 = 1000.0 в IEEE мне нужно, чтобы на левой стороне было только одно число, поэтому 1.000 * 2^3. Тогда как мне добавить один, чтобы я умножил его на 2? Мне нужно получить поплавок, т.е. 6.5 Превратить его в двоичный файл 110.1 Затем в IEEE 754 0 10000001 101000(...) Извлечь экспоненту 10000001 Добавить один к этому 10000010 Верните его в IEEE 754 0 10000010 101000(...) Затем вернемся к плаванию 13

Ответы [ 3 ]

0 голосов
/ 01 апреля 2019

Может быть, не совсем то, что вы ищете, но C имеет библиотечную функцию ldexp, которая делает именно то, что вам нужно:

double x = 6.5;
x = ldexp(x, 1); // now x is 13
0 голосов
/ 01 апреля 2019

Поскольку известно, что реализация C использует базовый 32-разрядный двоичный код с плавающей точкой IEEE-754 для своего типа float, следующий код показывает, как разбирать биты, представляющие float, настроить показатель степении собрать биты.Обрабатываются только простые умножения, включающие нормальные числа.

#include <assert.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>


int main(void)
{
    float f = 6.125;

    //  Copy the bits that represent the float f into a 32-bit integer.
    uint32_t u;
    assert(sizeof f == sizeof u);
    memcpy(&u, &f, sizeof u);

    //  Extract the sign, exponent, and significand fields.
    uint32_t sign        = u >> 31;
    uint32_t exponent    = (u >> 23) & 0xff;
    uint32_t significand = u & 0x7fffff;

    //  Assert the exponent field is in the normal range and will remain so.
    assert(0 < exponent && exponent < 254);

    //  Increment the exponent.
    ++exponent;

    //  Reassemble the bits and copy them back into f.
    u = sign << 31 | exponent << 23 | significand;
    memcpy(&f, &u, sizeof f);

    //  Display the result.
    printf("%g\n", f);
}
0 голосов
/ 01 апреля 2019

Может быть, профсоюзы - это тот инструмент, который вам нужен.

    #include<iostream>

    union fb {
        float f;
        struct b_s {
            unsigned int sign :1;
            unsigned int mant :22;
            unsigned int exp :8;
        } b;

    };

    fb num;

    int main() {
        num.f = 3.1415;
        num.b.exp++;
        std::cout << num.f << std::endl;
        return 0;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...