Нет, я думаю, что вы не поняли. Я не могу просто поменять бит знака и добавить. Когда я сказал, что мое дополнение работает, я имел в виду, что добавление одинаковых знаков работает. Вычитание добавляет разные подписанные числа с плавающей точкой. Вот для чего приведен код выше, но он не дает ожидаемого результата.

что я пытаюсь реализовать арифметическую библиотеку с плавающей точкой, и у меня проблемы с пониманием алгоритма вычитания чисел с плавающей точкой. Я успешно реализовал сложение, и я подумал, что вычитание было лишь частным случаем, но, похоже, я где-то ошибаюсь. Я добавляю код здесь только для справки, он имеет много самоочевидных функций, но я не ожидаю, что кто-то поймет его на 100%. В чем я хотел бы помочь, так это в алгоритме. Мы следуем тому же методу, что и при добавлении чисел с плавающей точкой, за исключением того, что, когда мы добавляем мантиссы, мы конвертируем отрицательный (тот, который мы вычитаем) в дополнение к двум, а затем добавляем их?

Это то, что я делаю, но результат не правильный. Хотя это очень близко ... но не то же самое. У кого-нибудь есть идеи? Заранее спасибо!

Я совершенно уверен, что способ, которым я делаю вещи, работает, так как я реализовал почти идентичный алгоритм добавления поплавков, и он работает как шарм.

_float subFloat(_float f1,_float f2)
{
unsigned char diff;
_float result;

//first see whose exponent is greater
if(f1.float_parts.exponent > f2.float_parts.exponent)
{
    diff = f1.float_parts.exponent - f2.float_parts.exponent;

    //now shift f2's mantissa by the difference of their exponent to the right
    //adding the hidden bit
    f2.float_parts.mantissa = ((f2.float_parts.mantissa)>>1) | (0x01<<22);
    f2.float_parts.mantissa >>= (int)(diff);//was (diff-1)

    //also increase its exponent by the difference shifted
    f2.float_parts.exponent = f2.float_parts.exponent + diff;
}
else if(f1.float_parts.exponent < f2.float_parts.exponent)
{
    diff = f2.float_parts.exponent - f1.float_parts.exponent;
    result = f1;
    f1 = f2;        //swap them
    f2 = result;

    //now shift f2's mantissa by the difference of their exponent to the right
    //adding the hidden bit
    f2.float_parts.mantissa = ((f2.float_parts.mantissa)>>1) | (0x01<<22);
    f2.float_parts.mantissa >>= (int)(diff);

    //also increase its exponent by the difference shifted
    f2.float_parts.exponent = f2.float_parts.exponent + diff;
}
else//if the exponents were equal
  f2.float_parts.mantissa = ((f2.float_parts.mantissa)>>1) | (0x01<<22); //bring out the hidden bit




//getting two's complement of f2 mantissa
f2.float_parts.mantissa ^= 0x7FFFFF;
f2,.float_parts.mantissa += 0x01;



result.float_parts.exponent = f1.float_parts.exponent;
result.float_parts.mantissa = (f1.float_parts.mantissa +f2.float_parts.mantissa)>>1;
                                                //gotta shift right by overflow bits

//normalization
if(manBitSet(result,1))
    result.float_parts.mantissa <<= 1;  //hide the hidden bit
else
    result.float_parts.exponent +=1;

return result;

}

Ответы на вопрос(2)

Ваш ответ на вопрос