В моем курсе информатики мне было поручено написать функцию, которая принимает два аргумента с плавающей запятой и возвращает результат их умножения на языке Си
float multiply(float foo, float bar);
Мне запрещено использовать любые библиотеки или любые операции с плавающей запятой, кроме оператора присваивания =
Я понимаю, как с плавающей точкой представлены в C, и я извлек показатели и дроби, выполнив это:
union sp_item { float frep; unsigned irep; };
union sp_item num;
num.frep = foo;
int exponent = ((num.irep >> 23) - 0x7f);
int frac = (num.irep << 9);
Я понимаю, что мне нужно добавить показатели (достаточно просто) и умножить две дроби. Дело в том, что я понятия не имею, с чего начать умножать дроби. Я думал о преобразовании дроби в ее шестнадцатеричное представление в виде строки (например, 0.5 будет «80000000») и написание алгоритма для умножения битов таким образом, но так как я не могу использовать ни одну из библиотек C, которые у меня есть Понятия не имею, как бы я поступил так. Может ли кто-нибудь указать мне правильное направление?
Редактировать: Мне пришло в голову, что плавающие могут быть представлены не во всех системах одинаково. В этом курсе мы предполагаем, что первый бит - это знак, следующие 8 бит - это показатель степени, а последние 23 бита - это дробь.
Редактировать: Это то, что я получил до сих пор. Когда я пытаюсь умножить два целых числа, я просто получаю ноль, если я не введу (long long)((long long)xRep * (long long)yRep)
в мой список наблюдения отладчиков
#include <stdio.h>
union sp_item
{
float frep;
unsigned irep;
};
int main() {
float x = 0.25;
float y = 0.5;
union sp_item xUnion;
union sp_item yUnion;
xUnion.frep = x; yUnion.frep = y;
unsigned xExp = (xUnion.irep >> 23) - 0x7f;
unsigned yExp = (yUnion.irep >> 23) - 0x7f;
unsigned xRep = (xUnion.irep << 9);
unsigned yRep = (yUnion.irep << 9);
xRep = (xRep >> 1) | 0x80000000;
yRep = (yRep >> 1) | 0x80000000;
long long final = (long long)((long long)xRep * (long long)yRep);
printf("iRep: %x * 2^%d\n", xRep, xExp);
printf("iRep: %x * 2^%d\n", yRep, yExp);
printf("%01611x\n", final);
}